如何在 Git Bash 中将 git log 输出进行管道传输?

3

原因:我想使用差异工具比较两个任意不同的提交。我知道这些提交的哈希值,但是我不想复制这些哈希值,因此我正在寻找一条命令,可以执行类似以下的操作

命令如下:
$ log_str=$(git log --all -S"new_tour <-" --pretty=format:"%h")
$ git difftool -t kdiff3 log_str[1] log_str[2] myfile.txt
  • 我希望能够处理任意的索引,而不仅仅是1和2。
  • 如果答案可以提示如何确定log_str的结构,那将非常好。它是字符吗? 字符数组? 列表? ... 使用Bash。

我在这里这里找到了一些相关的帮助,但我无法使其工作。
现在我做:

$ git log --pretty=format:"%h"
3f69dc7  
b8242c6  
01aa74f  
903c5aa  
069cfc5  

and

$ git difftool -t kdiff3 3f69dc7 b8242c6 myfile.txt

你想要执行 git diff HEAD~1 HEAD 命令吗?这就是你当前所拥有的命令。(与 git show 命令相同) - hek2mgl
@hek2mgl 不,我想使用差异工具比较两个任意不同的提交,并且我不想复制哈希值... - Christoph
使用 git rev-list 而不是 git log:它专为脚本设计。 - torek
@torek:但是 git rev-list -S"new_tour <-" --pretty=format:"%h" 不起作用。我有什么遗漏吗? - Christoph
你之前使用了 --all 参数;在这里你需要使用它或者 HEAD(这是与 git log 的一个重要区别,如果没有给定其他修订版本的起始点,git log 会默认使用 HEAD)。完全删除 --pretty 参数:rev-list 的主要工作是列出修订版本哈希 ID,因此默认情况下就是这样做的。 - torek
显示剩余5条评论
1个回答

2

我建议采用两步走的方法,使用一个临时文件:

git log --all -S'SEARCH' --pretty=format:"%h" > tmp_out
git diff "$(sed -n '1p' tmp_out)" "$(sed -n '2p' tmp_out)" myfile.txt
rm tmp_out

sed用于显示文件的第1行和第2行。


使用变量:

search="foo"
index_a="1"
index_b="2"
file="myfile.txt"
git log --all -S"${search}" --pretty=format:"%h" > tmp_out
git diff "$(sed -n "${index_a}p" tmp_out)" "$(sed -n "${index_b}p"  tmp_out)" "${file}"
rm tmp_out

在一个Bash函数中:
search_diff() {
    search="${1}"
    index_a="${2}"
    index_b="${3}"
    file="${4}"
    git log --all -S"${search}" --pretty=format:"%h" > tmp_out
    git diff "$(sed -n "${index_a}p" tmp_out)" "$(sed -n "${index_b}p" tmp_out)" "${file}"
    rm tmp_out
}

search_diff "foo" 2 3 myfile.txt

欢迎您,但请不要以一种引入语法错误的方式修改我的答案。根据您的需求进行修改是可以的,但请不要直接更改原文。 - hek2mgl
对不起,出了什么问题?我在我的笔记本电脑上检查过了,一切都正常。否则我就不会改变任何东西了... - Christoph
你使用的是哪个Shell? - hek2mgl
Git bash for Windows - Christoph
不确定那里面有什么东西。在正常的bash中,使用def定义函数,比如def foo()会导致语法错误。除此之外,我通常不会修改答案,只会修复一些小的语法错误。你在自己的电脑上做什么是你的事,当然。 - hek2mgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接