git - merge 不同目录级别的 git 存储库

标签 git

我有一个存储库 B,其内容需要驻留在 A 的子目录中...在 A/src/B 中。我想最终得到一个存储库 A,其中包含来自 A 和 B 的提交历史。

网络上的其他解决方案似乎向我展示了如何在单独的子树中保持树的完整性或 merge 具有相同目录结构的存储库的选定部分。

那么,有没有办法做到这一点?

最佳答案

事实上,这很简单,但命令不一定很明显。如果您稍后需要 merge 来自 B 的更多更新,一个不错的选择是 git-subtree (不要与子树 merge 策略混淆)。你说你想以一个存储库结束,所以使用 git 子模块是不合适的。

这是执行此操作的经典方法,并附有一些解释:

  1. 更改为存储库 A:

    cd A
    
  2. 从存储库 B 中获取 master 分支(或其他分支),并(暂时)将其存储为 FETCH_HEAD:

    git fetch /home/whoever/dev/B master
    
  3. 执行忽略来自 FETCH_HEAD 的更改的 merge ,但不提交。这样我们就可以稍后提交 merge , merge 的父级将包含 FETCH_HEAD。 (该父项存储在 .git/MERGE_HEAD 中。)

    git merge -s ours --no-commit FETCH_HEAD
    
  4. FETCH_HEAD 中读取树(仍然是 B 的提取的 master 分支)到子目录 源/B-u 意味着在工作副本中也反射(reflect)出结果:

    git read-tree --prefix=src/B/ -u FETCH_HEAD
    
  5. 最后提交结果:

    git commit -m "Merge in the history of master from B into src/B"
    

这类似于 GitHub's help page on the subtree merge strategy 中的建议,只是我跳过了为 B 创建 Remote 。请注意,此过程实际上并未使用子树 merge 策略 - 如果我理解正确的话,那只会用于 merge B 的进一步更改。

关于git - merge 不同目录级别的 git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8929071/

相关文章:

合法提交消息的 git 钩子(Hook)(#123 好消息)

git - 如何在不首先实际 merge 的情况下测试 merge

java - 通过 bash 和 Java 的 ProcessBuilder api 运行相同的命令会得到不同的输出

git - 无响应的 git 状态、差异、添加(挂起)

git - 只需一次提交即可 merge 请求

git - 如何将dev分支中的文件 merge 到master分支

git - .gitignore 用于 Joomla 组件

git - 推送克隆的存储库时出错

git - 致命的 : does not appear to be a git repository

git - 使用 Git 对小型内部团队有意义吗?