我需要在过去的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'
它仍然有点罗嗦,噪音很大,如果你有更好的解决方案,请回答。
答案 0 :(得分:7)
获取最近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
答案 1 :(得分:1)
git grep SEARCH `git rev-list HEAD~20..HEAD`
指定所需的范围。
结果将是每个修订的grep。 也就是说,您看到每个修订中的所有事件。您看不到相对于先前版本的更改。 (通过将自己与上一修订版列出的行进行比较)
也很慢。因为它会对范围内的每个修订版执行完整的grep。
或者,您可以将其限制为与搜索字词相关的修订(在范围内)。
git grep SEARCH `git log -G SEARCH --format=%H HEAD~20..HEAD`
虽然仅限于具有相关搜索的修订,但是在每个此类修订中,您都会再次获得所有行。
答案 2 :(得分:0)
最简单的方法:GIT_SEQUENCE_EDITOR=: git rebase --exec "git rev-parse HEAD; git --no-pager grep -n 'TEXT_TO_FIND'; echo " -i HEAD~20
详细说明:
git rev-parse HEAD
- 显示当前的sha1
git --no-pager grep -n 'TEXT_TO_FIND'
- 用于查找文本的grep命令,您可以在此处使用任何其他命令(如常规grep
等)。
echo
- 在每次提交之间打印空行的命令,并确保返回值始终正常
HEAD~20
- 你想要搜索多少次回复(这里我做了20次)
答案 3 :(得分:0)
试试这个:
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Lord Voldemort (Tom Marvolo Riddle)");
这适用于单一提交版本。也许你可以循环n次以达到你的目标。
答案 4 :(得分:0)
如果您要搜索范围内的已修改文件(并且不关心那些在那些提交中未实际修改的文件的匹配行),则可以运行:
git grep TEXT -- $(git diff --name-only RANGE)