gpt4 book ai didi

git - 在 git 提交范围内搜索文本

转载 作者:IT王子 更新时间:2023-10-29 00:43:42 26 4
gpt4 key购买 nike

我需要在过去 20 次 git 提交(或范围)中搜索文本“TEXT”
我需要查看匹配的文件名和行号。

注意:
我想搜索提交内容,但不像 git grep 那样在该提交上进行投影。
我所说的提交内容是指我可以使用 git diff HEAD^^^..HEAD

看到的内容

我得到的最接近的是使用 git log --raw -GTEXT,它向我显示提交内容中包含“TEXT”并显示文件名。但是仍然没有行号。

还有一些管道
git diff $(git log -n 20 --pretty=format:%h -GTEXT) | grep -E 'TEXT|\+\+\+|@@\s'

还是有些啰嗦,杂音多,如果有更好的解决办法,请回答。

最佳答案

获取最后 20 次提交:

git log -n 20

获取每个关联数组:

declare -A COMMITS # Declare associative array
COMMITNUMBER=0

while read -r line; do # For each line, do
# Add 1 to COMMITNUMBER, if the current line contains "commit [0-9a-f]* (e.g., new associative array index for each commit)
# As this'll happen straight way, our array is technically 1-indexed (starts from "${COMMITS[1]}", not "${COMMITS[0]}")
REGEX="commit\s[0-9a-f]*"
[[ "$line" =~ $REGEX ]] && COMMITNUMBER=$(( COMMITNUMBER+1 ))

# Append the commit line to the index
COMMITS[$COMMITNUMBER]="${COMMITS[$COMMITNUMBER]} $line"
done < <(git log -n 20)

然后迭代:

for i in "${!COMMITS[@]}"
do
echo "key : $i"
echo "value: ${COMMITS[$i]}"
done

这给出了类似下面的输出:

key  : 1
value: commit 778f88ec8ad4f454aa5085cd0c8d51441668207c Author: Nick <nick.bull@jgregan.co.uk> Date: Sun Aug 7 11:43:24 2016 +0100 Second commit
key : 2
value: commit a38cd7b2310038af180a548c03b086717d205a61 Author: Nick <nick.bull@jgregan.co.uk> Date: Sun Aug 7 11:25:31 2016 +0100 Some commit

现在你可以使用 grep 或任何东西在循环中搜索每个,并匹配你需要的:

for i in "${!COMMITS[@]}"
do
REGEX="Date:[\s]*Sun\sAug\7"
if [[ "${COMMITS[$i]}" =~ $REGEX ]]; then
echo "The following commit matched '$REGEX':"
echo "${COMMITS[$i]}"
fi
done

总计:

search_last_commits() {
[[ -z "$1" ]] && echo "Arg #1: No search pattern specified" && return 1
[[ -z "$2" ]] && echo "Arg #2: Number required for number of commits to return" && return 1

declare -A COMMITS # Declare associative array
COMMITNUMBER=0

while read -r line; do # For each line, do
# Add 1 to COMMITNUMBER, if the current line contains "commit [0-9a-f]* (e.g., new associative array index for each commit)
# As this'll happen straight way, our array is technically 1-indexed (starts from "${COMMITS[1]}", not "${COMMITS[0]}")
REGEX="commit\s[0-9a-f]*"
[[ "$line" =~ $REGEX ]] && COMMITNUMBER=$(( COMMITNUMBER+1 ))

# Append the commit line to the index
COMMITS[$COMMITNUMBER]="${COMMITS[$COMMITNUMBER]} $line"
done < <(git log -n $2)

for i in "${!COMMITS[@]}"
do
REGEX="$1"
if [[ "${COMMITS[$i]}" =~ $REGEX ]]; then
echo "The following commit matched '$REGEX':"
echo "${COMMITS[$i]}"
fi
done
}

编辑:

用法:

search_last_commits <search-term> <last-commits-quantity>

例子:

search_last_commits "Aug" 20

关于git - 在 git 提交范围内搜索文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38693264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com