如何从本地库创建一个远程Git库?


242

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

Answers:


286

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


@小贴士:是的,对不起。您确实推动了各个分支!
Kerrek SB 2011年

如果我正在使用GUI怎么办?如何为所有存储库设置服务器,并且同一网络上的每台PC都连接到该服务器?
SearchForKnowledge

4
如果git push origin master失败并显示“找不到存储库”错误,请尝试git update-server-info在远程操作的地方进行操作git init --bare
HongKilDong 2015年

7
@KerrekSB是否有可能在我在本地运行git push origin master时自动在服务器上自动创建裸
仓库

我尝试了@HongKilDong git update-server-info但遇到了错误 fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
Nayef

80

为了最初设置任何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

此时,对同一/opt/git目录具有读访问权限的服务器具有SSH访问权限的其他用户可以通过运行以下命令来克隆您的存储库

$ 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访问的服务器上非常容易。现在您可以在同一项目上进行协作了。


6
scp解决方案在实践中比IMO更适合IMO init --bare。虽然首先在本地克隆,然后复制到服务器,但仍然感觉有点难看。希望git有一个命令可以一次性完成。
大约

1
+1了这是因为它--shared为我工作。我想知道,如果你使用会发生什么git init --shared而不做--bare一个...
icedwater

1
在本地创建一个裸存储库scp,如果远程不支持该存储库,则该远程存储会更好git init --bare(例如git 1.5.5,2008)。我认为即使遥控器完全没有git,这也应该起作用。
雅罗斯拉夫·尼基琴科


1
一个小小的注意事项:该解决方案的步骤scp是正确的,但是如果远程用户具有常规shell,则该步骤有效,如果用户使用git-shell,则它将不起作用。
user1708042

8

给在Windows上创建本地副本并希望在Unix行系统上创建相应的远程存储库的人的说明,在该行上,文本文件在类似Unix的系统上由开发人员在进一步的克隆上获得LF结尾,而在Windows上则获得CRLF结尾。

如果在设置行尾翻译之前创建了Windows系统信息库, 那么您会遇到问题。Git的默认设置是不翻译,因此您的工作集使用CRLF,但是您的存储库(即,存储在.git下的数据)也已将文件另存为CRLF。

当您按下遥控器时,已保存的文件将按原样复制,不会发生行尾翻译。(行结束翻译发生在将文件提交到存储库时,而不是在推送存储库时)。您最终在类Unix的存储库中获得了CRLF,这不是您想要的。

要在远程存储库中获取LF,必须通过重新规范Windows存储库来确保LF首先在本地存储库中。这对Windows工作集仍然具有CRLF结尾,将不会有可见的影响,但是当您按下遥控器时,遥控器将正确获得LF。

我不确定是否有一种简单的方法来判断Windows存储库中的行尾-我猜您可以通过设置core.autocrlf = false然后克隆来测试它(如果存储库具有LF尾声,则克隆将具有LF)。


4

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

  1. 如果您像这样创建裸仓库:

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

然后

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. 但是,如果您反过来这样做:

    (来自original_repo目录)
    光盘..
    git clone --bare original_repo /outside_of_any_repo/my_remote.git
    

然后,“ my_remote.git”的配置结束,“ origin”指向“ original_repo”作为远程,remote.origin.url等于本地目录路径,如果要移动它可能不合适到服务器。

尽管如果不合适,很容易在以后删除“远程”引用,但仍必须将“ original_repo”设置为指向“ my_remote.git”作为上游远程对象(或指向何处)共享)。因此,从技术上讲,使用方法2,您可以通过几个步骤来获得相同的结果。但是,#1似乎是一种更直接的方法来创建“中央裸共享仓库”,该仓库源于本地服务器,适合于迁移到服务器,涉及的步骤更少。我认为这取决于您希望远程回购发挥的作用。(是的,这与此处的文档冲突。)

警告:我通过使用真实的回购在本地系统上进行测试,然后在结果之间进行逐个文件的比较来了解以上内容(在撰写本文时于2019年8月开始)。但!我仍在学习,因此可能会有更正确的方法。但是我的测试帮助我得出结论,#1是我目前首选的方法。


3

远程存储库通常是裸存储库-没有工作目录的Git存储库。由于存储库仅用作协作点,因此没有理由在磁盘上签出快照;这只是Git数据。用最简单的术语来说,裸仓库是项目的.git目录的内容,仅此而已。

您可以使用以下代码创建一个裸git存储库:

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

具有远程git存储库的一种选择是使用SSH协议:

通过SSH进行自我托管时,Git的通用传输协议。这是因为大多数地方已经设置了对服务器的SSH访问,如果没有,则很容易做到。SSH还是经过身份验证的网络协议,并且由于它无处不在,因此通常很容易设置和使用。

要通过SSH克隆Git存储库,您可以指定如下ssh://网址:

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

或者,您可以将较短的类似于scp的语法用于SSH协议:

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

在上述两种情况下,如果您未指定可选的用户名,则Git会假定您当前以该用户身份登录。

优点

使用SSH的优点很多。首先,SSH相对容易设置-SSH守护程序很常见,许多网络管理员都有使用它们的经验,并且许多OS发行版都由它们设置或具有管理它们的工具。接下来,通过SSH的访问是安全的-所有数据传输都经过加密和身份验证。最后,像HTTPS,Git和本地协议一样,SSH高效,在传输数据之前使数据尽可能紧凑。

缺点

SSH的不利方面是它不支持对Git存储库的匿名访问。如果您使用的是SSH,则即使是只读权限的人员也必须具有SSH访问权限,这不利于SSH促进人们可能只是希望克隆您的存储库以对其进行检查的开源项目。如果仅在公司网络内使用它,则SSH可能是唯一需要处理的协议。如果您想允许匿名只读访问您的项目,并且还想使用SSH,则必须设置SSH以便您进行推送,但要设置其他内容以供他人使用。

有关更多信息,请检查参考: 服务器上的Git-协议


2

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

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

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


-4

通常,您只需使用以下init命令即可设置git repo

git init

就您而言,远程上已经有一个仓库。根据您访问远程存储库的方式(使用url内的用户名或处理验证的ssh密钥),仅使用以下clone命令:

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

还有其他克隆仓库的方法。如果您的计算机上安装了ssh密钥设置,可以验证是否提取存储库,则可以通过这种方式进行调用。如果要在其中包含密码和用户名以登录到远程存储库,则还有URL的其他组合。


1
这有多讽刺。...今天有人对此投票否决了,现在我正努力推进自己的文件。看来我需要一些git锻炼才能再次加入git!
亚历克斯·西奥

7
我认为问题在于OP需要一种在SSH服务器上创建远程仓库的解决方案,但是您介绍了如何从远程SSH服务器创建本地仓库。您没有回答问题。(不是我很沮丧)
彼得-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.