所以在运行git commit
之前,我经常运行以下内容:
git grep --cached -l -I "debugger"
我认为它类似于:
git diff --cached
(它将显示您即将提交的所有更改,即将显示您的暂存文件中的差异)。
不幸的是,我刚刚发现--cached
的git grep
选项只是告诉git“只”查看其索引中的所有内容。
那么我怎样才能运行git grep
并让它只通过我的分段文件?
(是的,我知道我可以简单地做git diff --cached
并搜索,但我宁愿有编程能力来浏览我的分段文件。)
如果你有一个类似Unix的shell,答案很简单:
git grep --cached "debugger" $(git diff --cached --name-only)
这将在分阶段文件列表中运行git grep
。
许多预提交钩子使用git diff-index --cached -S<pat> REV
来查找添加或删除特定模式的更改。所以在你的情况下,git diff-index --cached -Sdebugger HEAD
。您可能还想添加-u
以获取差异,否则它只是识别有问题的文件。
首先,您需要从索引中获取文件列表(不包括已删除的文件)。这可以通过以下方式完成:
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
还有一个git pre-commit钩子的here's an example,它使用这种方法检查版权年份是否在要提交的文件中是最新的。