如何从本地创建远程Git存储库?

我有一个本地Git存储库。我想让它在远程的、启用ssh的服务器上可用。我怎么做呢?

316738 次浏览

我认为你在远程端创建了一个裸存储库git init --bare,将远程端添加为本地存储库(git remote add origin URL)的推/拉跟踪器,然后在本地输入git push origin master。现在任何其他存储库都可以从远程存储库pull

对于在Windows上创建本地副本并希望在unix行系统上创建相应远程存储库的人来说,这里的文本文件在类unix系统上的开发人员进一步克隆时得到LF结尾,但在Windows上得到CRLF结尾。

如果你在设置行结束转换之前创建了Windows存储库,那么你就有问题了。Git的默认设置是不翻译,所以您的工作集使用CRLF,但您的存储库(即存储在. Git下的数据)也将文件保存为CRLF。

当您推到远程时,保存的文件将按原样复制,不会发生行尾转换。(行尾转换发生在文件提交到存储库时,而不是推送存储库时)。您最终会在类unix存储库中使用CRLF,这不是您想要的。

要在远程存储库中获取LF,必须首先通过重新规范化您的Windows存储库确保LF在本地存储库中。这将对您的Windows工作集没有明显的影响,它仍然有CRLF结束,但是当您推到远程时,远程将正确地获得LF。

我不确定是否有一种简单的方法来告诉你在你的Windows存储库中有什么行尾-我猜你可以通过设置core来测试它。selflf =false,然后克隆(如果回购有LF结尾,克隆也会有LF结尾)。

为了最初设置任何Git服务器,您必须将现有的存储库导出到一个新的裸存储库—一个不包含工作目录的存储库。这通常很简单。为了克隆您的存储库以创建一个新的裸存储库,您可以运行带有--bare选项的clone命令。按照惯例,裸存储库目录以.git结尾,如下所示:

$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/

这个命令单独获取Git存储库,没有工作目录,并单独为它创建一个目录。

现在您已经有了存储库的一个裸副本,您所需要做的就是将它放到服务器上并设置协议。假设你已经建立了一个名为git.example.com的服务器,你可以通过SSH访问它,并且你想将你所有的Git存储库存储在/opt/git目录下。你可以通过复制你的裸存储库来建立新的存储库:

$ scp -r my_project.git user@git.example.com:/opt/git

此时,对同一台服务器具有读访问权的其他用户可以通过运行命令克隆您的存储库

$ git clone user@git.example.com:/opt/git/my_project.git

如果用户ssh进入服务器并对/opt/git/my_project.git目录具有写访问权,他们也将自动具有推访问权。如果你运行带有--shared选项的Git init命令,Git会自动为存储库添加组写权限。

$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared

获取Git存储库,创建一个裸版本,并将其放在您和您的合作者可以SSH访问的服务器上,这是非常容易的。现在你已经准备好在同一个项目上合作了。

通常你只需要使用init命令就可以建立一个git repo

git init

在您的情况下,已经有一个回购的远程可用。这取决于你如何访问远程repo(在url中使用用户名或处理验证的ssh密钥),只使用clone命令:

git clone git@[my.url.com]:[git-repo-name].git

还有其他方法可以克隆回购。如果您在计算机上设置了ssh密钥,在提取存储库时进行验证,则可以使用这种方法调用它。如果您希望在其中包含密码和用户名以登录到远程存储库,则该url还有其他组合。

您需要在远程服务器上创建目录。然后使用“git init”命令将其设置为存储库。对于每个新项目(每个新文件夹)都应该这样做

假设你已经使用ssh键设置和使用了git,我写了一个小的Python脚本,当从一个工作目录执行时,它将设置一个远程目录,并将该目录初始化为一个git repo。当然,您必须编辑脚本(只有一次)来告诉它所有存储库的服务器和根路径。

检查这里- https://github.com/skbobade/ocgi

远程存储库通常是一个裸存储库——一个Git存储库 没有工作目录。因为存储库仅用于 对于协作点,没有理由检查快照 在磁盘上;它只是Git数据。用最简单的话来说,就是赤裸 Repository是项目的.git目录的内容 什么都没有。< / p >

你可以用下面的代码创建一个git仓库:

$ git clone --bare /path/to/project project.git

有一个远程git存储库的选项是使用SSH协议:

当自托管通过SSH时,Git的公共传输协议。 这是因为在大多数服务器中已经设置了SSH访问 地点——如果不是,也很容易做到。SSH也是一个 经过身份验证的网络协议,因为它无处不在,所以 一般易于设置和使用 要通过SSH克隆Git存储库,可以指定ssh:// URL 这样的:< / p >

$ git clone ssh://[user@]server/project.git

或者你可以使用更短的类似scp的SSH协议语法:

$ git clone [user@]server:project.git

在上述两种情况下,如果你没有指定可选的用户名,Git 假设您当前登录的用户为。

的优点

使用SSH的优点有很多。首先,SSH相对容易设置 up - SSH守护进程很常见,很多网络管理员都有经验 许多操作系统发行版都安装了它们,或者已经安装了它们 管理它们的工具。其次,通过SSH访问是安全的——所有数据 传输经过加密和认证。最后,像HTTPS, Git和 本地协议,SSH是高效的,使得数据像

缺点

SSH的缺点是它不支持匿名访问 到Git存储库。如果你使用SSH,人们必须有SSH 访问您的机器,即使是在只读的能力,这不是 使SSH有利于人们可能会支持的开源项目 只想克隆您的存储库来检查它。如果你正在使用它 只有在您的公司网络中,SSH可能是您使用的唯一协议 需要处理。如果要允许匿名只读访问 你的项目,也想使用SSH,你就必须设置SSH

.

.

.

欲了解更多信息,请查看参考文献: 服务器上的Git -协议 < / p >

上面两种流行的解决方案之间有一个有趣的区别:

  1. 如果你像这样创建裸存储库:

    cd     /outside_of_any_repo
    mkdir  my_remote.git
    cd     my_remote.git
    git init --bare
    

and then

cd  /your_path/original_repo
git remote add origin /outside_of_any_repo/my_remote.git
git push --set-upstream origin master

然后git在'original_repo'中设置如下关系:

original_repo origin --> /outside_of_any_repo/my_remote.git/

后者作为上游遥控器。上游远程在其配置中没有任何其他远程。

  1. 但是,如果你反过来做:

    (from in directory original_repo)
    cd ..
    git clone --bare original_repo  /outside_of_any_repo/my_remote.git
    

then 'my_remote.git' winds up with its configuration having 'origin' pointing back to 'original_repo' as a remote, with a remote.origin.url equating to local directory path, which might not be appropriate if it is going to be moved to a server.

While that "remote" reference is easy to get rid of later if it isn't appropriate, 'original_repo' still has to be set up to point to 'my_remote.git' as an up-stream remote (or to wherever it is going to be shared from). So technically, you can arrive at the same result with a few more steps with approach #2. But #1 seems a more direct approach to creating a "central bare shared repo" originating from a local one, appropriate for moving to a server, with fewer steps involved. I think it depends on the role you want the remote repo to play. (And yes, this is in conflict with the documentation here.)

Caveat: I learned the above (at this writing in early August 2019) by doing a test on my local system with a real repo, and then doing a file-by-file comparison between the results. But! I am still learning, so there could be a more correct way. But my tests have helped me conclude that #1 is my currently-preferred method.

在当前代码文件夹中。

git remote add origin http://yourdomain-of-git.com/project.git
git push --set-upstream origin master

然后通过

git remote --v

我有一个覆盆子,我可以通过ssh通过公钥访问(没有提示密码)。

在覆盆子上,我做到了

mkdir -p /home/pi/my/repo
cd /home/pi/my/repo
git init --bare

在我的笔记本电脑上,我做到了

git clone  ssh://pi@raspberry/home/pi/my/repo
cd myrepo
touch README.md
git add README.md
git commit -m "First commit"
git push

就是这样