【问题标题】:Moving patches in git repository with different directory structure在具有不同目录结构的 git 存储库中移动补丁
【发布时间】:2015-02-25 09:36:18
【问题描述】:

对于这个有点冗长和混乱的标题,我深表歉意。我们有一个 git 存储库,其目录结构如下(根代表存储库根;名称是虚构的):

/
/dir1/
/dir2/
/dir2/subdir1/
/dir2/subdir2/

团队同事使用/dir2/subdir1 的副本创建了一个新的git 存储库,即/dir2/subdir1 成为新存储库的根。我们在那个新存储库中做了一些(约 15 次)提交,然后我们决定在旧存储库中复制新提交。

执行此操作的最佳方式是什么?

当然,我们可以从新存储库创建一个补丁并将其作为单个提交应用到旧存储库中,但这样做会丢失历史的粒度。

在此期间旧存储库中没有涉及/dir2/subdir1 的提交,因此绝对应该没有冲突。

【问题讨论】:

    标签: git


    【解决方案1】:

    解决方案是使用git format-patchgit am。在新的存储库中,我做了一个

    git format-patch $revision
    

    ,其中$revision 是新版本库中对应于旧版本库状态的版本,即添加/dir2/subdir1 的版本。这创建了大约 15 个文件,其中包含每个提交的补丁。

    然后我转移到旧存储库并使用git am 应用刚刚创建的补丁。我只需要指定必须应用这些补丁的目录:

    git am --directory dir2/subdir1 $patches
    

    ,其中$patches 是在上一步中创建的文件。

    现在提交从新的 repo 移到旧的 repo 中,我很高兴!

    【讨论】:

      【解决方案2】:

      选项1:分别为每个提交创建补丁(git format-patch),并按顺序应用到旧仓库

      选项 2:将新的 repo 作为远程添加到旧的 repo,获取分支,在本地 repo 上签出分支并选择所有提交(使用gitk 更容易`)

      选项3:将新repo作为远程添加到旧repo,获取分支,并将其与旧repo中的分支合并。

      希望对你有帮助!

      【讨论】:

      • 选项 1 是明确的。我想避免它,因为它既费时又无聊,而且我想在 git 中学习新的东西(如果可能的话)。选项 2 和 3 依赖于两个存储库在目录结构方面兼容的事实,不是吗?如果我将新仓库中的分支与旧仓库中的分支合并,我会丢失目录/dir1//dir2/subdir2/。还是我错过了什么?
      • @Spiros:不,除非您在新存储库中明确删除它们并提交删除,否则您不会丢失任何东西。目录结构需要相同:是和否!如果在你的旧仓库中你有 /dir2/sub1 并且在新仓库中你也有 /dir2/sub1 那就没有区别了。但是如果在你的新仓库中你只有 /sub1,那么你就有点问题了! :)(虽然可以解决)
      • 我的情况是/dir2/subdir1 是新存储库的根目录:该目录中的所有文件都在新存储库的根目录中。无论如何,您对 Option1 的建议非常成功,我只用两个命令就解决了我的问题。我将发布我自己问题的答案。非常感谢!
      猜你喜欢
      • 2018-01-11
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多