在我正在使用的一些存储库中,我发现git子树在共享存储库时的行为并不像预期的那样。
以下是该方案:
git subtree add
时,Git子树总是说该文件夹已经存在,并说当我git subtree merge
时它无法找到提交。有谁知道处理这种情况的最佳方法?理想情况下,我也希望能够从repo Y中提取更改,即使我不是用户添加repo Y作为repo X的子树。这可能吗?如果没有,分享具有子树的存储库的最佳方法是什么?
答案 0 :(得分:4)
使用git subtree pull
。
git subtree add
将另一个存储库的历史记录添加为 new 子树 - 在您的情况下,这已经由您的同事完成,因此它无法工作
git subtree merge
将更改与给定的本地提交合并到子树中 - 因为您还没有提取这些更改,它也无法工作
git subtree pull
从另一个repo中提取更改,然后将它们合并到子树中。使用以下命令序列进行测试(使用子树存储库的' master'分支,根据需要进行调整)。
~ $ mkdir subrepo ~ $ cd subrepo ~/subrepo $ git init Initialized empty Git repository in ~/subrepo/.git/ ~/subrepo $ touch file ~/subrepo $ git add file [master (root-commit) 03a9f75] file added 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 file ~/subrepo $ cd .. ~ $ mkdir repo1 ~ $ cd repo1 ~/repo1 $ git init Initialized empty Git repository in ~/repo1/.git/ ~/repo1 $ git commit --allow-empty -m "initial commit" [master (root-commit) ec7e1c5] initial commit ~/repo1 $ git subtree add --prefix=sub ../subrepo master git fetch ../subrepo master warning: no common commits remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From ../subrepo * branch master -> FETCH_HEAD Added dir 'sub' ~/repo1 $ cd .. ~ $ git clone repo1 repo2 ~ $ cd subrepo ~/subrepo $ echo 'new version' > file ~/subrepo $ git add file ~/subrepo $ git commit -m "file changed" [master c72ac6e] file changed 1 file changed, 1 insertion(+) ~/subrepo $ cd ../repo2 ~/repo2 $ git subtree pull --prefix=sub ../subrepo master remote: Counting objects: 5, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From ../subrepo * branch master -> FETCH_HEAD Merge made by the 'recursive' strategy. sub/file | 1 + 1 file changed, 1 insertion(+) ~/repo2 $ cat sub/file new version
答案 1 :(得分:1)
通常这些命令应该满足您的所有需求;除非你搞砸了事情。请注意此site
上的壁球问题在另一个
中添加一个存储库作为子树cd super
git remote add sub git@gitlab:chris.maes/sub.git
git fetch sub #or use: git fetch --all
git subtree add -P subdir -m "add sub as subtree in subdir" sub/master
将子项目中的更改合并到超级项目中
git fetch sub (or git fetch --all)
git subtree merge -P subdir -m "merged changes of sub" sub/master
将超级项目中的更改推送到子项目
git subtree split -P subdir -b backport
git push sub backport:master