是否可以修改默认git-merge-one-file程序以在不触及工作树的情况下执行索引中的所有操作,使其完全不修改?
更新和细节
所以我现在明白,如果不使用工作树,就不会发生文件级合并(合并对文件中的行而不是整个文件).(与整个文件的合并不同.)所以我将不得不使用工作树.
另一个细节:我可以使用该解决方案仅在合并可以自动完成而无需手动解决的情况下工作.如果合并不是自动的,它只是显示错误消息是没关系的.(当然,保持一切都干净.)
另一个细节:我没有git-merge-one-file直接使用,我在这个脚本中使用它:https://gist.github.com/cool-RR/6575042
我试着按照@torek的建议并使用临时工作树(正如你在脚本中看到的那样),因为这似乎是迄今为止最好的方向.问题是,我得到这些错误:
git checkout-index: my_file is not in the cache
error: my_file: cannot add to the index - missing --add option?
Run Code Online (Sandbox Code Playgroud)
我搜索了这些错误消息,但找不到任何有用的信息.
知道该怎么办?
虽然git需要一个地方来完成它的工作,但是你可以在"合并一个文件"操作期间将它指向不同的工作树位置.
我不知道是否/如何"开箱即用" merge-one-file,但设置的env变量是GIT_WORK_TREE:
env GIT_WORK_TREE=/some/where/else git ...
Run Code Online (Sandbox Code Playgroud)
(你可以省去env大多数但不是全部的炮弹).
一个或多或少等效的方法可能"感觉更安全":-)或为某些目的更方便的是在另一个目录中工作,并使用GIT_DIR到repo的位置:
cd /some/where/else
env GIT_DIR=/place/with/repo/.git git ...
Run Code Online (Sandbox Code Playgroud)
您甚至可以将它们组合起来,同时设置GIT_DIR和GIT_WORK_TREE.
Jeff King帮助我解决了问题,我更新了脚本以使其正常工作:
https://gist.github.com/cool-RR/6575042
#!bash
if [ -n "$2" ]; then
export SOURCE=$1 ;
export DESTINATION=$2 ;
else
export SOURCE=HEAD ;
export DESTINATION=$1 ;
fi
export GIT_INDEX_FILE=`git rev-parse --show-toplevel`/.git/aux-merge-index ;
export GIT_WORK_TREE=`create_temporary_folder gm_`;
echo $GIT_INDEX_FILE
trap 'rm -f '"'$GIT_INDEX_FILE'"'; rm -rf '"'$GIT_WORK_TREE'" 0 1 2 3 15 ;
mkdir $GIT_WORK_TREE/.git
set -e ;
git read-tree -im `git merge-base $DESTINATION $SOURCE` $DESTINATION $SOURCE ;
#echo Finished read-tree
#sleep 1000
git merge-index git-merge-one-file -a
#echo Finished merge-index
git write-tree \
| xargs -i@ git commit-tree @ -p $DESTINATION -p $SOURCE -m "Merge $SOURCE into $DESTINATION" \
| xargs git update-ref -m"Merge $SOURCE into $DESTINATION" refs/heads/$DESTINATION ;
exit 0
Run Code Online (Sandbox Code Playgroud)