Git能否将裸库克隆到另一个裸库?

5
我相信这是可以实现的,只是我不确定正确的方法。
我的情况是有一个USB驱动器、一个本地硬盘和一个网络驱动器都连接到我的电脑上。本地硬盘将包含本地活动仓库以供我进行本地工作。网络驱动器(具有长的UNC路径!)将包含作为上游参考副本的主裸仓库(办公室中有2或3个协作者),而USB驱动器则充当我的移动副本,可用于将代码 Sneakernetting 到一些外部PC上(我的其他协作者有自己的驱动器,这可能会影响答案)。 (这是在Windows msysgit上进行的)
设置USB驱动器并确保我正确地指导工作流程是关注的重点(请参见使用Git在USB闪存上进行旅行代码)。
  • 我应该克隆本地仓库还是网络仓库?
  • 有哪些特殊标志可以确保正确卸载USB驱动器?(-nohardlinks?)
  • 等等。

你不能在一个(逻辑)磁盘上创建到另一个磁盘的硬链接。 - svick
3个回答

8
您可以使用带有长UNC路径的repo从存储在USB闪存中的裸克隆创建:
cd /e/src
git clone --bare //server/path/to/your/network/repo.git
但我怀疑这样做并没有多大好处。
考虑到您将在本地活动repo中工作,我会在USB闪存上创建一个裸repo:
cd git init --bare /e/src/myproject.git
在本地活动repo中创建一个远程:
git remote add usb file:///e/src/myproject.git
然后根据需要将其推送:
git push usb philip/cool-new-feature
以上命令假设您的USB闪存为E:且您的工作目录位于本地活动repo内。
据我了解,您至少有两个不相交的协作者集,具体取决于其他协作者是否共享自己的中央repo或全部在孤立的机器上工作。这意味着USB闪存中的repo是每个人(最终)都可以访问的repo,因此您的队友在很大程度上与它“同机”。
设计开发流程的建议:
  1. 避免您或其他人成为指定的合并者。相反,您希望团队中的所有成员尽可能频繁地进行集成,以使潜在的冲突更小且易于管理。
  2. 不相交的协作者增加了某个人会破坏其他人所依赖的功能的风险,无论是通过看似无害的更改还是通过错误地解决合并冲突。您应该有一种快速的、一键式方法来确定是否有任何回归或新错误潜入代码中。
  3. 每组协作者,即那些比起USB闪存更频繁访问彼此的repo或共享repo的协作者,都应该在自己之间实践持续集成。当来自USB闪存的新提交可用时,将其与来自团队其余部分的新代码集成应成为最优先考虑的事项。
您可以这样做,让每个人保持干净的主分支,并仅在其他分支上进行更改。物理拥有USB闪存是一种自然的集成标记,因此当给定的协作者拥有它时,序列如下:
git checkout master
git pull usb master     # 应始终是快进
git merge feature1
make test               # 或其他操作,并重复直到没有故障
git commit
git push usb master
git push shared master  # 如果适用
git merge feature2      # 如果需要
...

我很幸运,我们合作得非常好。问题的一部分在于机器之间的交换(以及在公司系统下的适应);-) - Philip Oakley

3

我建议创建一个主网络库的镜像克隆:

cd /path/to/usb/drive
git clone --mirror url://to/main/network/repo/project.git

镜像克隆是一个裸仓库,具有与原始仓库完全相同的分支、标签等。

不用担心传递--no-hardlinks,因为在文件系统之间无法硬链接。

每当您想要更新您的USB镜像时,只需挂载它并运行以下命令:

cd /path/to/usb/drive/project.git
git remote update -p

如果您曾经将USB驱动器镜像推送到了本地仓库中,那么将这些提交推送到主网络仓库的最佳方式是通过本地硬盘仓库:

# initial setup
cd /path/to/local/project
git remote add usb /path/to/usb/drive/project.git

# grab the commits from the usb drive
git remote update -p

# merge the usb drive commits into your local master branch
git merge usb/master

# push the result up to the main network repo
git push

我可能不会在这个(我的当前)工作流程中使用“建议创建主网络存储库的镜像克隆”,主要是因为我们每个人都在开发新的代码片段,直到准备好将它们推送到主(网络)存储库之前,不会将它们推送上去,但会在离线机器上尝试一些东西(因此需要 USB 传输)。不过我可以看到有些工作流程确实需要这样做。 - Philip Oakley

0

你可以从任何一个克隆。一旦 USB 驱动器完成,您可以将其移除。您可以在之后进行完整性双重检查。

git fsck --full

有没有想法应该克隆哪个仓库?我最初想克隆上游网络裸仓库,但现在我认为我应该克隆我的本地(工作)仓库。 - Philip Oakley
"双重检查完整性": 绝对是一个值得的步骤;-) - Philip Oakley

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