12

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

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

我认为它类似于:

git diff --cached

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

不幸的是,我刚刚发现--cachedfor 选项git grep只是告诉 git“只”查看其索引中的所有内容。

那么我怎样才能运行git grep并让它只通过我的暂存文件进行 grep 呢?

(是的,我知道我可以简单地在其中进行git diff --cached搜索,但我宁愿拥有通过我的暂存文件进行 grep 的编程能力。)

4

3 回答 3

12

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

于 2010-11-04T23:12:55.210 回答
4

如果你有一个类 Unix shell 可用,答案很简单:

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

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

于 2018-11-29T09:34:46.407 回答
0

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

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

其次,您需要使用 : 前缀来访问当前索引中的文件内容(暂存但尚未提交),请参阅gitrevisions 手册 以获取更多信息。

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

这里还有一个 git pre-commit 钩子的示例,它使用此方法检查要提交的文件中的版权年份是否是最新的。

于 2018-01-19T00:11:51.913 回答