团队成员之间本地仓库的Git推送/拉取

21
假设有一个由4位开发人员组成的团队,并且我们有一个用于项目的中央代码库。开发人员从中央代码库推送和拉取更新。在这里“分散但集中”部分),它提到了可以在团队成员本地代码库之间进行推送/拉取。
  

每个开发者都会推送和拉取到远端主机(origin)。但是除了中心化的   推拉关系,每个开发人员还可以从其他同事那里拉取更改,以形成子团队……技术上,这意味着Alice已经定义了一个Git远程(remote),命名为bob,指向Bob的仓库,反之亦然。

问题是如何定义指向Bob仓库的远程名称bob。如果开发人员使用不同的操作系统是否会影响这一点。

我从未尝试过这个方法,因为它似乎有点复杂,但是只要在每台本地计算机上设置远程git访问就可以轻松实现。(创建一个git用户,添加授权密钥,创建一个派生的仓库等) - Daniel Williams
那篇文章中的所有内容对我来说似乎都是标准的工作流程。我看不到团队成员从其他同事那里拉取更改的任何优势。你可以在每个人的桌面上设置git服务器,但这对于没有实际改进的巨大麻烦。也许你应该给作者发推文?我会跟进这个问题。 - spuder
6个回答

7

如果您在主机上建立用户帐户并在仓库上具有访问权限,其他人可以使用SSH推送/提取操作,无论是否建立了命名的“远程”。

git push user@host:/path/to/repo branch

如果您经常共享代码,可以设置一个命名的远程来记住服务器路径:
git remote add remotename user@host:/path/to/repo

如果允许共享涉及到紧密协调(可能非常松散的安全性),您可以根据需要在“主”上启动一个短暂的git daemongit equivalent of 'hg serve'?。在这种情况下,以上共享命令仍然适用,但是user@host:path将被替换为git://host/。另请参阅git daemon documentation
或者,您可以设置一个单独的专用存储库,用于中间共享:How do I setup a staging repository in git?

这实际上比其他建议要简单得多。 - cheeze

4

这是一个非常常见的场景,比如说Alice和Bob需要共同开发某个功能。同时,不同的开发人员应该在不同的分支上进行开发。

简单的方法是:

  • Create a new branch sprint_1, Alice and bob checkout to sprint_1
  • All the changes related to functionality should be done here
  • Push and pull operations should be performed using

    git pull origin sprint_1  and git push origin sprint_1
    

当修改完成且sprint_1有稳定的代码后,可以将其与其他分支合并。如果sprint_1上的代码已经发生了很大的变化,建议使用rebase分支而非合并以避免冲突或挑选。


3
这不是我所要求的。我知道他们可以通过推送和拉取远程存储库来在任何分支上工作。 - nyzm
1
这并不是直接回答问题的答案,但我点赞它是因为它实际上更简单易懂且易于设置。所以如果你无法理解其他工作流程(或者你无法说服你的经理采用它,或者你的IT部门通过网络设置使开发人员之间的拉取变得困难),你可以使用这个设置。虽然不能扩展到成千上万的开发人员,但也不错。 - Wildcard
你似乎在重申OP已经知道的关于如何在集中模型中使用Git分支和远程的内容。OP想知道如何进入真正的去中心化模型,其中托管repo的每个节点都是其他节点的远程。就像@Wildcard提到的那样,集中模型的正交性很容易理解,但这并不是对原始问题的好答案。 - Josh Gust

2
在Windows本地文件系统中克隆GIT存储库类似
根据J.F.Sebastian的回复:
$ git clone --no-hardlinks /path/to/repo

The above command uses POSIX path notation for the directory with your git repository. For Windows it is (directory C:/path/to/repo contains .git directory):

C:\some\dir\> git clone --local file:///C:/path/to/repo my_project

The repository will be clone to C:\some\dir\my_project. If you omit file:/// part then --local option is implied.


这很接近。团队中有macOS或Linux用户吗? - nyzm
@nyzm 我知道我的评论有点晚了,但Windows是个例外,Mac和Linux是一样的。但是如果你在Windows上使用git bash与git交互(我相信bash终端是与Git捆绑在一起的,但我已经很久没有在Windows上使用Git了,所以我可能记错了),那么无论你使用哪个操作系统,功能都是相同的。 - StormeHawke

1
我想做类似的事情,在我的情况下,我正在寻找一种简单的方法来同步嵌入式系统上的项目(运行Linux)。 以前,我只是设置了共享互联网连接,并从集中式存储库中拉取。 但我发现这样工作并不容易,有时我的互联网连接很差。
在下面的文章中,非常好地解释了使用git daemon解决此问题的方法。 我将在此处放入内容的简要副本: http://railsware.com/blog/2013/09/19/taming-the-git-daemon-to-quickly-share-git-repository/ 为读取访问(serve)或读/写访问(hub)设置以下别名以访问您的存储库:
$ git config --global alias.serve "!git daemon --base-path=. --export-all --reuseaddr --informative-errors --verbose"
$ git config --global alias.hub "!git daemon --base-path=. --export-all --enable=receive-pack --reuseaddr --informative-errors --verbose"

然后在主机上只需在存储库所在的目录中执行git servegit hub即可。现在在客户端上可以执行git clone git://x.x.x.x/path/to/repo来访问主机上的本地存储库!
对于Windows用户:
  • 在设置别名的命令中使用双引号
  • 确保通过右键单击标题栏并选择“编辑”->“标记”来挂起命令提示符,以便不输出任何行。否则,由于git中的一个错误(根据博客文章中的评论),可能会中断与客户端的连接。

1
如果这两个仓库共享文件系统命名空间,则可以直接使用文件系统路径。否则,开发人员可以轻松地在本地运行git服务器,例如在VPN上,其中访问已经是可用的私有的git daemon命令将服务于提取操作,否则您可以设置专用端口上的ssh访问以获得同样的效果,但需要更多的工作。

5
需要解释git daemon,这会更有帮助。我感觉这个命令才是真正回答这个问题的答案,但目前发布的任何答案都没有对其进行解释。 - Wildcard

0

简短概述 - 您需要为每个作为远程机器的章节4.4执行步骤。

如果您在自己的计算机和想要共享的计算机之间有自由,那么获得真正的分布式工作流程并不是很困难。基本上,您需要让每台机器作为SSH git服务器来提供repo服务。

这里有几个答案指出,你可以在机器之间简单地添加用户,并使用用户密码来建立SSH连接。Git书的第4.1章和4.4章还详细介绍了创建一个单一用户,该用户授予远程请求访问~/.ssh/authorized_keys文件中SSH密钥列表的权限。这似乎是管理授予同事访问权限的不错方法,但仍需要在授权账户的authorized_keys文件中管理用户密钥。需要考虑的一点是,这是“你”的开发框,而不是一个适当的“服务器”。

我从未使用过git daemon,所以无法确切地说它是否更好,但如果您愿意使用git协议,并且对在网络中的每台机器上运行它有很好的理解,则似乎是一个可行的选择,应该从网络中的安全位置为存储库提供服务。在这里还可能有帮助的是,文档在提到防火墙设置时提到了以下内容:

如果您正在运行防火墙,则还需要在您设置此项的计算机上的9418端口打开一个洞。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接