繁体   English   中英

将本地 git 存储库的准确 state 复制到另一个本地存储库

[英]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和索引等文件。 这意味着,如果您:

  • 在添加的工作树中使用分离的 HEAD,并进行新的提交,它们被删除 (,),并且
  • 即使您不使用分离的 HEAD,如果您git add更新的文件但不提交,则可以删除任何新的存储库级 blob 对象(!)

这导致一团糟。

标准默认的 14 天宽限期意味着如果您在 14 天内完成所有工作,然后丢弃添加的工作树,则此错误永远不会影响您,因此如果您的 Git 版本低于 2.15,则可以使用git worktree add只要您在两周内完成添加的工作树的所有操作,就可以安全地进行操作。

(不过,这个错误实际上咬了我。幸运的是,添加的工作树只是一个我已经放弃但还没有删除的实验,我能够清理这些东西。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM