乍看上去
git-read-tree
对于子树,我会看
git read-tree -u --prefix dir1/ HEAD:dir2
这不会进行合并(git read-tree --merge 不支持 --prefix 同时...)
手动解决方案
否则,你能做的最好的,可能是
basecommitish='HEAD^'
git show "$basecommitish":dir1/a" > /tmp/a.orig
git show HEAD:dir2/b > /tmp/b.new
git merge-file dir1/a /tmp/a.orig /tmp/b.new
这适用于我的测试存储库,导致正确合并对dir1/a
和dir2/b
.
检测基础修订
不幸的是,为合并找到正确的基础版本可能是一个挑战,因为它git merge-base
不适用于提交 ID 之外的其他对象引用。
查找文件相同的最新版本
因此,这里有一个片段可以帮助您开始查找两个文件同步的修订版(仅查看内容):
git rev-list HEAD | while read sha1
do
blob1=$(git rev-list --objects $sha1:dir1/a)
blob2=$(git rev-list --objects $sha1:dir2/b)
echo $sha1: $blob1 $blob2
if [ "$blob1" == "$blob2" ];
then
echo Match;
break;
fi
done
我的 testrepo 上的输出:
c5a6b97712d9ebd49146dad6523b2bbc33aea7c0: 4ce3b294e6408ace53b50127aafb2c9308caacf1 e913153db7650d7b8e947066652cf21388552812
7b75768fd3434c867d3741cf07044bf04ef1cc79: 03b82631ac519bf10c20bb12d3b1b03b872dd087 03b82631ac519bf10c20bb12d3b1b03b872dd087
Match
git rev-list HEAD
您可以通过替换 轻松包含其他分支上可能存在的任何修订git rev-list --all
。
查找文件相同的一对修订
一个更高级的脚本将通过嵌套循环在不匹配的修订中查找匹配的内容
function findblobs()
{
for path in "$@";
do
git rev-list HEAD | while read sha1
do
echo $sha1 $(git rev-list --objects "$sha1:$path")
done | uniq -f 1
done
}
现在您可以通过以下方式找到相同的信息
findblobs dir1/a dir2/b | sort -k2 | uniq -Ddf 1
// output on testrepo again:
7b75768fd3434c867d3741cf07044bf04ef1cc79 03b82631ac519bf10c20bb12d3b1b03b872dd087
7b75768fd3434c867d3741cf07044bf04ef1cc79 03b82631ac519bf10c20bb12d3b1b03b872dd087
// force multiple hits across several revisions:
git show 7b75768fd3:dir1/a > dir2/b && git commit -am 'force synch with 7b75768fd3'
findblobs dir1/a dir2/b | sort -k2 | uniq -Ddf 1
// output is now:
46b8748f121f8842d936994fa09ad1a81b35d3cc 03b82631ac519bf10c20bb12d3b1b03b872dd087
7b75768fd3434c867d3741cf07044bf04ef1cc79 03b82631ac519bf10c20bb12d3b1b03b872dd087
7b75768fd3434c867d3741cf07044bf04ef1cc79 03b82631ac519bf10c20bb12d3b1b03b872dd087
由于使用了稳定的排序,您可以在此示例调用sort(1)
中依赖第一个提交哈希对应dir1/a
和第二个提交哈希(注意调用中的排序)dir2/b
findblobs