Git子树 - 与贡献者共享子树

时间:2014-03-11 14:14:38

标签: git git-subtree

在我正在使用的一些存储库中,我发现git子树在共享存储库时的行为并不像预期的那样。

以下是该方案:

  1. 我拥有主要的回购X并将其推向原产地。
  2. 我的同事从原点拉回购X,添加一个指向另一个回购Y的子树,进行提交,然后将X推回原点。
  3. 我拉X并看到我的同事所做的改变。但是,在我的本地存储库中,包含子树Y的文件夹只是另一个文件。即使将回购Y添加为远程,我也无法从回购Y中提取更改。当我执行git subtree add时,Git子树总是说该文件夹已经存在,并说当我git subtree merge时它无法找到提交。
  4. 有谁知道处理这种情况的最佳方法?理想情况下,我也希望能够从repo Y中提取更改,即使我不是用户添加repo Y作为repo X的子树。这可能吗?如果没有,分享具有子树的存储库的最佳方法是什么?

2 个答案:

答案 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