[英]Copy exact state of local git repo to another local repo
有没有办法将本地 git 存储库(未提交的更改和所有)的确切 state 复制到另一个本地存储库?
目标 repo 应该切换到源 repo 的确切 state,包括分支、提交和自上次提交以来任何未提交的更改 - 编辑、新文件、删除......
每次我需要这个功能时都没有复制整个目录,我想不出该怎么做。
显然,将目标仓库检查到同一个提交会很容易,但是我不确定这是未提交的更改。
编辑(为什么我想要这个。)我正在构建一个本地构建系统(用于 Unity 游戏),通常在 Unity 内部进行构建时,您不能将该程序用于其他任何事情。 所以我有一个系统,其中另一个 Unity 实例在项目文件的副本上进行构建,每次触发构建时,我都会删除旧副本并制作新副本。 但是我的想法是,如果副本在同一个提交上并且说只有两个未提交的文件不同,那么仅修补状态会快得多。 我在测试时构建未提交的工作,因此提交更改并不是一个真正的选择!
任何建议都非常感谢!
干杯
每次我需要这个功能时都没有复制整个目录,我想不出该怎么做。
复制整个目录有什么问题? 如果您真的不想这样做(例如因为它很大),请使用任何文件夹同步实用程序,例如rsync
。 我经常使用这两种方法。
您可以使用存档器( tar
或其他)收集整个存储库和工作树 state 并将其复制到其他文件树区域:
cd /path/to
tar cf - repo | (cd /different/path; tar xf -)
例如,将整个文件树从/path/to/repo
复制到/different/path/repo
。 这会复制存储库本身( .git
中的所有文件)和工作树(所有不在.git
中的文件)。
这里有一些警告。 最重要的是,工作树顶层下的.git
必须确实是包含存储库的目录,而不仅仅是像git worktree add
创建的文件。
使用 in-Git 方法,例如git clone
是行不通的:它们只复制存储库。 工作树不是存储库的一部分:
每次我需要这个功能时都没有复制整个目录,我想不出该怎么做。
那是因为 Git 字面上不会这样做。 工作树——你的工作树——是你的,不是 Git 的,它不是 Git 存储库的一部分。 它就在存储库旁边,即.git
子目录中的内容。
如果你有 Git 2.5 或更高版本——最好是 2.15 或更高版本,因为在此之前有一个非常讨厌的错误1——无论你想做什么,通过git worktree add
可能会更好地处理。 这会创建一个单独的工作树,这又是您的,而不是 Git 的,其中 Git 在运行git worktree add
时对您选择的某些提交或分支进行 git git checkout
。 第二个工作树没有自己的存储库:它使用原始工作树的存储库,方法是创建一个名为.git
的文件,而不是一个名为.git
的目录。
(实际存储库在git worktree add
处获取了很多 state 文件来跟踪这个添加的工作树的存在。添加的工作树需要添加一个新的索引,新的HEAD
等等,所有的它们专用于新的工作树,并与索引和HEAD
等用于主工作树,主工作树仍然位于主存储库旁边。请注意,如果您稍后使用上述tar
技巧复制实际存储库,它仍然会认为它有这些添加的工作树。如果它们仍然存在,那很好;如果不存在, git worktree prune
将使复制的存储库更新其外部世界外观的概念。)
1错误是git gc
未能查看添加的HEAD
和索引等文件。 这意味着,如果您:
git add
更新的文件但不提交,则可以删除任何新的存储库级 blob 对象(!)这导致一团糟。
标准默认的 14 天宽限期意味着如果您在 14 天内完成所有工作,然后丢弃添加的工作树,则此错误永远不会影响您,因此如果您的 Git 版本低于 2.15,则可以使用git worktree add
只要您在两周内完成添加的工作树中的所有操作,就可以安全地进行操作。
(不过,这个错误实际上咬了我。幸运的是,添加的工作树只是一个我已经放弃但还没有删除的实验,我能够清理这些东西。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.