我能把Git工作副本复制到另一台机器上吗?

49

我正在使用"git svn clone"从我们的SVN服务器创建Git工作副本,但这需要相当长的时间(我们有> 20,000个版本和近10,000个文件)。我有其他一些机器(给其他开发人员使用),我想以相同的方式设置。是否可以复制第一台机器上的结果文件,以便节省时间?

换句话说,Git工作副本中是否有任何内容将其绑定到创建它的计算机上?

谢谢。


6
可以这样做,但是不需要复制整个工作树。只需复制.git文件夹而不带工作树(即作为“裸”仓库),然后在另一台机器上检出最新的工作树即可。 - Ben James
5个回答

57
你可以复制它,一切都在.git文件夹中,不依赖于其他任何东西。

11
几乎正确。除了像自定义差异驱动程序和钩子脚本这样可能引用外部程序的配置项之外,还有一些简单的配置项通常会因平台而异。在不同平台之间复制时,应检查/设置/取消设置诸如core.ignorecase、core.autocrlf、core.safecrlf、core.fileMode等项目(可能还有其他项目)。但我认为,从复制的.git目录重新克隆应该总是安全的。 - Chris Johnsen
我刚刚通过简单地复制整个开发环境及其包含的4个仓库,并将每个仓库分别作为自己的分支,成功地克隆了整个环境。一切都运行得非常顺利。 - Chris

11
值得一提的是,如果你没有任何本地更改("git status" 没有显示你想要保留的任何内容),你可以复制 .git 目录,并从(几乎空的)存储库根目录执行 "git checkout ." 命令。
如果传输速度较慢,重打包存储库也可能是值得考虑的。
我唯一有点担心的是 git-svn 是否会记住某些用户信息,这些信息你可能不想复制给其他开发者。

1
我的名字和电子邮件地址确实出现在.git/logs/refs/remotes/trunk中。尽管目录的名称是“logs”,但我想这可能会对其他开发人员造成问题... - Xavier Nodet

3

不用担心,只需复制存储库的根目录即可。请确保获取任何不可见文件,尤其是项目根目录中包含所有存储库配置信息的.git目录。


0

如果您使用worktrees功能,它将会出现问题,因为该功能使用绝对路径。yourworktreefolder/.git指向parentgitabsolutepath/.git/worktrees/yourworktreename

但是很容易解决,只需更新yourworktreefolder/.git中的路径,使其指向新的父路径即可。


0

我曾尝试在类似的 SVN --> Git 迁移场景中使用相同的策略,但遇到了“可疑所有权错误”。

我们采用的策略是,我使用 git SVN 克隆了仓库以导入修订历史记录,让每个人在 SVN 中拉取更新,并进行最后一次 git svn fetch/rebase,使得 git 仓库与 SVN 同步。然后,我将本地仓库中的 .git 文件夹压缩并通过电子邮件发送给所有团队成员。这样,当将 .git 文件夹放置在项目目录的根目录中时,远程和上游分支将被预配置,我们不必费力地从头开始配置和设置新项目,因为该项目很旧,启动一个新项目需要很多工作,而且它(理论上)只会识别每个人所拥有的待处理更改,从而消除了我们必须清空工作目录的需要。

然而,当我们将文件夹解压缩到项目中时,它拒绝将其识别为 git 仓库,因为该仓库与我的计算机相关联,显示“致命错误:可疑所有权错误”。

我能想到的唯一解决方法是

  1. 让每个人从Github上克隆整个repo,然后将克隆的目录中的.git文件夹复制到部署的项目中,因为该.git文件夹将被分配给每个用户。

  2. 在每个人的计算机上运行命令git config --global --add safe.directory <绝对路径到项目目录>,但我已经读到这可能会有bug。


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