Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

git rerere does not auto-commit autoupdated merge resolutions

I'm trying to use the shared rerere cache to automate throwaway integration/test branches.

The idea is that the rerere cache should be up to date when the branch is pushed, so that these merges always pass. However, they don't:

>>> git merge --no-ff invoicing
Staged 'analysisrequest.py' using previous resolution.
Staged '__init__.py' using previous resolution.
Auto-merging __init__.py
CONFLICT (content): Merge conflict in __init__.py
Auto-merging analysisrequest.py
CONFLICT (content): Merge conflict in analysisrequest.py
Automatic merge failed; fix conflicts and then commit the result.

At this point, rerere has staged the resolutions that it remembered, and no actual conflict exists. I can run git commit, then continue, but my integration-test-build script sees an error. I've tried adding --rerere-autoupdate to the git merge command, but nothing changes. I have configured the repo to enable and auto-apply rerere matches.

How can I ask git merge to use my previous resolutions and continue without failing if they are sufficient?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Even with the --rerere-autoupdate flag, git merge seems to be reluctant to automatically complete the merge without some human input. This being the case, it executes with an error status, and your integration tool refuses to proceed.

I do not know how your automatic merging is happening, namely, if you can change the git command that is executed. If you can, then you can execute the following commands.

git merge --no-ff branch-to-merge --rerere-autoupdate
if [[ $(git rerere diff) ]]
then
    git commit --no-edit
else
    $(exit 1)
fi
  • git rerere diff list files that need to be resolved after rerere
  • --no-edit is necessary to prevent opening the commit message editor
  • In case rerere was not able to cleanly merge all changes this statement will still execute with an error status, and the merge will not be committed.
    • The commit message will still contain the conflicting files
  • exit 1 needs to be inside $() unless you want to exit your shell (guess how I know this :-))

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...