Skip to contentSkip to conversation

subtree merge tries to merge into wrong directory

DISCUSSION Nils Adermann 3 participants 6 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

Following http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html I have subtree merged a 3rd party library (ezc-reflection) into my repository (pflow). The prefix I used was lib/ezc/trunk/Reflection. Now there have been changes to ezc-reflection but merging them into my repository fails. The merge is attempted in example/ rather than lib/ezc/trunk/Reflection.

I originally set this up with:

git remote add -f ezc-reflection /path/to/ezc-reflection
git merge -s ours --no-commit ezc-reflection/master
git read-tree --prefix=lib/ezc/trunk/Reflection -u ezc-reflection/master

Reproduce my problem by executing the following:

git clone git://github.com/naderman/pflow.git
cd pflow
git reset --hard f3e001e3
git fetch git://github.com/naderman/ezc-reflection.git master git merge -s subtree FETCH_HEAD

As you see this results in:

CONFLICT (delete/modify): example/src/doc_comment_parser.php deleted in HEAD and modified in FETCH_HEAD. Version FETCH_HEAD of example/src/doc_comment_parser.php left in tree. Automatic merge failed; fix conflicts and then commit the result.

As long as I don't make any changes to lib/ezc/trunk/Reflection that I want to merge I can work around this by simply repeating my original process like this:

git clone git://github.com/naderman/pflow.git
cd pflow
git reset --hard f3e001e3
git fetch git://github.com/naderman/ezc-reflection.git master git merge -s ours --no-commit FETCH_HEAD
git rm -r lib/ezc/trunk/Reflection/
git read-tree --prefix=lib/ezc/trunk/Reflection/ -u FETCH_HEAD

Why does this problem occur and how can I get the merge to work properly?

Cheers,
Nils Adermann

#1 lore raw
Quoted 41 lines · Nils Adermann

Following
http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
I have subtree merged a 3rd party library (ezc-reflection) into my repository (pflow). The prefix I used was lib/ezc/trunk/Reflection. Now there have been changes to ezc-reflection but merging them into my repository fails. The merge is attempted in example/ rather than lib/ezc/trunk/Reflection.

I originally set this up with:

git remote add -f ezc-reflection /path/to/ezc-reflection
git merge -s ours --no-commit ezc-reflection/master
git read-tree --prefix=lib/ezc/trunk/Reflection -u ezc-reflection/master

Reproduce my problem by executing the following:

git clone git://github.com/naderman/pflow.git
cd pflow
git reset --hard f3e001e3
git fetch git://github.com/naderman/ezc-reflection.git master git merge -s subtree FETCH_HEAD

As you see this results in:

CONFLICT (delete/modify): example/src/doc_comment_parser.php deleted in HEAD and modified in FETCH_HEAD. Version FETCH_HEAD of example/src/doc_comment_parser.php left in tree.
Automatic merge failed; fix conflicts and then commit the result.

As long as I don't make any changes to lib/ezc/trunk/Reflection that I want to merge I can work around this by simply repeating my original process like this:

git clone git://github.com/naderman/pflow.git
cd pflow
git reset --hard f3e001e3
git fetch git://github.com/naderman/ezc-reflection.git master git merge -s ours --no-commit FETCH_HEAD
git rm -r lib/ezc/trunk/Reflection/
git read-tree --prefix=lib/ezc/trunk/Reflection/ -u FETCH_HEAD

Quoted 1 line

Why does this problem occur and how can I get the merge to work properly?

I'm not sure, but maybe you can try git-subtree?
It makes this stuff easier for mere mortals.

http://github.com/apenwarr/git-subtree/

You might need to start redo your repo, but several people have had good success with git-subtree.

Signature · 1 line
		David
#2 lore raw
Quoted 36 lines · David Aguilar
Quoted 31 lines · Nils Adermann

Following http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html I have subtree merged a 3rd party library (ezc-reflection) into my repository (pflow). The prefix I used was lib/ezc/trunk/Reflection. Now there have been changes to ezc-reflection but merging them into my repository fails. The merge is attempted in example/ rather than lib/ezc/trunk/Reflection.

I originally set this up with:

git remote add -f ezc-reflection /path/to/ezc-reflection
git merge -s ours --no-commit ezc-reflection/master
git read-tree --prefix=lib/ezc/trunk/Reflection -u ezc-reflection/master

Reproduce my problem by executing the following:

git clone git://github.com/naderman/pflow.git
cd pflow
git reset --hard f3e001e3
git fetch git://github.com/naderman/ezc-reflection.git master git merge -s subtree FETCH_HEAD

As you see this results in:

CONFLICT (delete/modify): example/src/doc_comment_parser.php deleted in HEAD and modified in FETCH_HEAD. Version FETCH_HEAD of example/src/doc_comment_parser.php left in tree. Automatic merge failed; fix conflicts and then commit the result.

As long as I don't make any changes to lib/ezc/trunk/Reflection that I want to merge I can work around this by simply repeating my original process like this:

git clone git://github.com/naderman/pflow.git
cd pflow
git reset --hard f3e001e3
git fetch git://github.com/naderman/ezc-reflection.git master git merge -s ours --no-commit FETCH_HEAD
git rm -r lib/ezc/trunk/Reflection/
git read-tree --prefix=lib/ezc/trunk/Reflection/ -u FETCH_HEAD

Quoted 2 lines

Why does this problem occur and how can I get the merge to work properly?

Quoted 8 lines

I'm not sure, but maybe you can try git-subtree?
It makes this stuff easier for mere mortals.

http://github.com/apenwarr/git-subtree/

You might need to start redo your repo, but several people have had good success with git-subtree.

I actually tried that and I get the exact same problem. From what I understand git-subtree really doesn't do anything different than what I do anyway.

#3 lore raw
In reply to Nils Adermann
Quoted 7 lines · Nils Adermann

Following
http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
I have subtree merged a 3rd party library (ezc-reflection) into my repository (pflow). The prefix I used was lib/ezc/trunk/Reflection. Now there have been changes to ezc-reflection but merging them into my repository fails. The merge is attempted in example/ rather than lib/ezc/trunk/Reflection.

The auto-guessing feature of "merge -s subtree" doesn't always work. The 'pu' branch of git has some patches which allow you to use a command line like

git merge -Xsubtree=lib/ezc/trunk/Reflection

If you're nervous about using all of 'pu', try building git's 'master' after merging from commit 0354b06927a1220b696a5ee1004a8f061ba9b153.

Eventually my git-subtree tool will use this automatically, but it's obviously not much use until the patches hit a released version of git.

Hope this helps.

Avery

#4 lore raw
Quoted 1 line · Avery Pennarun

On Wed, Dec 9, 2009 at 10:41 PM, Nils Adermann <[email protected]>

Quoted 8 lines · wrote:
Quoted 7 lines

Following
http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
I have subtree merged a 3rd party library (ezc-reflection) into my repository (pflow). The prefix I used was lib/ezc/trunk/Reflection. Now there have been changes to ezc-reflection but merging them into my repository fails. The merge is attempted in example/ rather than lib/ezc/trunk/Reflection.

Quoted 8 lines

The auto-guessing feature of "merge -s subtree" doesn't always work. The 'pu' branch of git has some patches which allow you to use a command line like

git merge -Xsubtree=lib/ezc/trunk/Reflection

If you're nervous about using all of 'pu', try building git's 'master' after merging from commit 0354b06927a1220b696a5ee1004a8f061ba9b153.

So I finally got around to trying this. This was my first result:

$ git merge -Xsubtree=lib/ezc/trunk/Reflection/ FETCH_HEAD
fatal: entry  not found in tree 60270661e0d2a5ee03b24609fac5c6d00d048988

Interestingly the following works, as in merges correctly into lib/ezc/trunk/Reflection/. The "arbitrary" part can be set to anything it just needs to be set. No directory with that name is created.

$ git merge --strategy-option=subtree=arbitrary FETCH_HEAD
Merge made by recursive.
 .../trunk/Reflection/src/doc_comment_parser.php    |   38
++++++++++---------
 1 files changed, 20 insertions(+), 18 deletions(-)

While the following results in the same issue I originally had with -s strategy

$ git merge --strategy-option=subtree FETCH_HEAD
CONFLICT (delete/modify): example/src/doc_comment_parser.php deleted in
HEAD and modified in FETCH_HEAD. Version FETCH_HEAD of
example/src/doc_comment_parser.php left in tree.
Automatic merge failed; fix conflicts and then commit the result.

I'm not sure why this is happening, but the --strategy-option=subtree=arbitrary solves my issue for now.

Cheers
Nils

#5 lore raw
Quoted 5 lines · [email protected] schrieb:

So I finally got around to trying this. This was my first result:

$ git merge -Xsubtree=lib/ezc/trunk/Reflection/ FETCH_HEAD
fatal: entry  not found in tree 60270661e0d2a5ee03b24609fac5c6d00d048988

Turns out that only happens because of the trailing slash. lib/ezc/trunk/Reflection works reliably.

Nils