在提交之前如何通过您的暂存文件进行grep?

时间:2010-11-04 22:53:37

标签: git grep commit git-commit

因此,在运行git commit之前,我经常会运行以下内容:

git grep --cached -l -I "debugger"

我认为它类似于:

git diff --cached

(它将显示您即将提交的所有更改,即将显示您的暂存文件中的差异)。

不幸的是,我发现--cached的{​​{1}}选项只是告诉git“只”查看其索引中的所有内容。

那么如何运行git grep并让它只通过我的暂存文件?

(是的,我知道我可以简单地git grep进行搜索,但我宁愿拥有编程能力来浏览我的分段文件。)

3 个答案:

答案 0 :(得分:12)

许多预提交挂钩使用git diff-index --cached -S<pat> REV来查找添加或删除特定模式的更改。所以在你的情况下,git diff-index --cached -Sdebugger HEAD。您可能还想添加-u以获取差异,否则它只会识别有问题的文件。

答案 1 :(得分:1)

如果有类似Unix的shell,答案很简单:

git grep --cached "debugger" $(git diff --cached --name-only)

这将在暂存文件列表上运行git grep

答案 2 :(得分:0)

首先,您需要从索引中获取文件列表(不包括已删除的文件)。 这可以通过以下方式完成:

git diff --cached --name-only --diff-filter=d HEAD

其次你需要使用:前缀来访问文件中的内容 当前索引(暂停但尚未提交)请参阅gitrevisions manual 了解更多信息。

git show :<file>

最后,这是一个将所有内容放在一起来grep这个文件列表的例子

# Get a list of files in the index excluding deleted files
file_list=$(git diff --cached --name-only --diff-filter=d HEAD)

# for each file we found grep it's contents for 'some pattern'
for file in ${file_list}; do
    git show :"${file}" | grep 'some pattern'
done

同样是here's an example git预提交挂钩,它使用此方法检查版权年份是否在要提交的文件中是最新的。