如何将git与meld一起用于git子模块

dfddblmv  于 2023-02-14  发布在  Git
关注(0)|答案(1)|浏览(137)

我有一个顶级仓库,里面包含了一些git子模块,我可以用下面的命令对它进行git diff:

git diff d1e92 ade34

这只表明子模块中有一些哈希值发生了变化,而不是子模块本身发生了变化。
我发现:

git diff --submodule=diff d1e92 ade34

其如预期的那样工作并且还示出了子模块内部的真实差异。
现在我想对git difftool做同样的事情,但是我找不到任何语法可以给我预期的结果。
如果我简单地使用

git difftool -d --submodule=diff d1e92 ade34

我只看到更改的哈希值,而看不到子模块更改的内容。
我想看到所有子模块在主存储库中的所有变化。另一个问题只要求子模块中的差异。我的问题不是Git Directory Diff does not work in my submodule的重复,因为它正好是我想做的相反的操作!

hgb9j2n6

hgb9j2n61#

我在搜索类似问题时遇到了您的主题。
我发现了一种获取信息的方法,通过编写脚本并调用difftool,为每个子模块使用适当的commit #(有点类似于foreach方法),但仍然会为每个子模块获得一个新示例。
下面是为获取结果而创建的别名;我使用了几个别名来更好地调试我的脚本,只需在git bash中调用 *git dtz 2 commit 1 commit 2 * 来使用它。

dt = difftool --dir-diff
dtverbose = "!sh -c 'echo parent:diff $1-$2 && git dt $1 $2 '" -

dta2 = "!f() { git diff-tree -r "$1" "$2" | grep :160000 | cut  -d' ' -f3,4,5 ; }; f"

dty2 = "!sh -c 'echo $4:diff $1-$2 && cd $4 && git dt $1 $2 '" - 

dtz2 = "!f() { (git dta2 "$1" "$2" | tr -s ' \t' ' ' | xargs -o -n4 git dty2) && git dtverbose "$1" "$2" ; }; f"

有趣的部分是git diff-tree命令比较commit 1和commit 2;剩下的就是输出消息传递给difftool。你可以用git ls-tree创建一个类似的命令,但它只能在HEAD vs commit 1中工作。虽然git ls-tree已经识别了子模块的提交,但git diff-tree只使用objectId(子模块为'160000')。

相关问题