问题 在提交之前如何通过您的分阶段文件进行grep?


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

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

我认为它类似于:

git diff --cached

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

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

那我该怎么办呢 git grep 让它只通过我的分阶段文件grep?

(是的,我知道我可以做到 git diff --cached 并搜索,但我宁愿有编程能力来浏览我的分阶段文件。)


9699
2017-11-04 22:53


起源

那么,你有没有设法解决这个问题?我对答案很感兴趣。 - ZeroOne


答案:


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


11
2017-11-04 23:12



该 -S 选项采用固定字符串,而不是正则表达式。 (我不确定你的意思是“pat”。)但是,git diffcore最近获得了 -G<regex> 选项,应该让你做任何你想做的事情 git grep。它还没有发布的版本,但它已经发布了 git.git 主分公司。 - Cascabel
好的,这让我接近我需要的东西,但不是100%那里。如果添加或删除了-S <string>,这将为您提供正匹配。如果是的话我只想要一场比赛 添加。有没有办法做到这一点? - steve


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

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预提交钩子,它使用这种方法来检查版权年份是否在要提交的文件中是最新的。


0
2018-01-19 00:11