将两个repos的内容加入到另一个repo内的单个目录中

时间:2016-01-10 08:52:54

标签: git

我需要从说' modA'中获取两个回购的内容。和' modB'到一个目录' mods'在repo main。

  

     

- mods

     

------ modAfiles

     

------- modBfiles

使用git没有直接的方法来做这个,所以我创建了第三个加入这些回购的repo。 这些mods repos的内容保证不会相互冲突。所以不必担心冲突。

示例测试用例。

    for repo in main modA modB ; do
    git init $repo
    echo "test $repo" > "$repo/test$repo"
    cd $repo
    git add "test$repo"
    git config user.name "$repo test"
    git config user.email "$repo@test.test"
    git commit -m 'Initial commit'
    cd ..
    done

现在设置融合回购。

    git init fusion
    cd fusion
    git remote add modA ../modA/.git
    git remote add modB ../modB/.git
    git config user.name "fusion test"
    git config user.email "fusion@test.test"
    git fetch --all
    git checkout -b modB_master modB/master
    git checkout -b modA_master modA/master
    git checkout -b merge_master
    git merge modB_master -m "Fuse modA and modB"
    ls

现在的问题是将这个融合的回购添加到主回购。如果是“modA'或者' modB'更新我可以删除' merge_master'融合的分支'并再次创建它。

我不关心合并的历史。我只是想加入这些回购。我也不需要改变' fusion'或者' main'回购。 通过子树,我添加了' fusion'回复主要'回购。但每当我改变' merge_master'它会获得强制更新,并且所有提交都显示在' main'回购。

如何在不污染主回购的情况下将融合回购添加到main。我应该使用子模块吗? mods repo也经常更新。 (创建merge_master将自动化)。 或者有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以将submodules用于此目的。

子模块是项目内的一个项目。子模块的好处是它允许您通过共享相同的文件夹并将它们存储在同一个根目录下来为模块使用共享资源。

Git-Tools-Submodules
git-tip-of-week-git-submodules

enter image description here

Subtree

另一种选择是使用子树。与子模块非常相似,但内容在根项目中管理,而不是作为独立项目管理。

https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/

答案 1 :(得分:0)

看起来我的问题不在于合并,子树或子模块。

与嗯.. git本身。

我不想通过子回购中的不必要的提交,符号链接等污染我的主回购。

我想管理我的东西的一些部分应该驻留在一个目录中,但是在不同的存储库中。

我希望跟踪他们的历史,但这并不重要我的主要回购。

这不是git如何处理的事情 即使存储库可能是分开的,它仍然是连接的 如果我不想要这种联系,我就不得不对git'忽略它。'

所以我要为目录添加一个.gitignore(这不能在目录中,因为目录需要为空)..并且在我的目录中有我的融合回购。

然后,这个融合的回购可以直接从子回购的遥控器中拉出变化并合并甚至变形。

但是为了推动这些变化,我必须在主要回购之外克隆每个子回购。

如果我需要克隆主回购怎么办?

也许像android的回购管理工具" repo"可能对此有用..