确定目录中是否有任何文件更改过最新的Git提交

Jon*_*n49 6 git githooks

我正在为写一个post-commit钩子git。我想知道最新提交是否更改了特定目录中的任何文件。如果有任何更改,我可以继续并调用一些昂贵的代码,否则我可以跳过它。

所以,到目前为止,我得到的是像这样的简短哈希

# get last commit hash prepended with @ (i.e. @8a323d0)
function parse_git_hash() {
  git rev-parse --short HEAD 2> /dev/null | sed "s/\(.*\)/@\1/"
}
Run Code Online (Sandbox Code Playgroud)

现在,我需要确定指定目录是否有任何更改。但是我不确定该怎么做。我已经看了,用打git-loggit-show,但没有成功为止。

所以,我需要做这样的事情。

if [directory-changed()] {
  echo "start expensive operation"
}
Run Code Online (Sandbox Code Playgroud)

这实际上使我进入了其中:实际上,它捕获了最后一次提交而不是指定的提交。

git log  -U a79851b -1 my/directory/path
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Sto*_*ica 6

您可以使用以下命令在最新提交中添加,修改,删除和重命名文件:

git diff --name-only --diff-filter=AMDR --cached @~..@
Run Code Online (Sandbox Code Playgroud)

要获取影响特定目录的更改,请使用过滤输出grep。例如:

changes() {
  git diff --name-only --diff-filter=AMDR --cached @~..@
}

if changes | grep -q dirname {
  echo "start expensive operation"
}
Run Code Online (Sandbox Code Playgroud)

  • 这有效:`git diff --name-only --diff-filter=ADMR @~..@` (4认同)
  • 删除“--cached”对我有用(在 OSX、Linux 和管道上运行)。我最终使用了 `git diff --name-only --diff-filter=ADMR @~..@ ./$BASE_DIR/$SERVICE_NAME` 这将为我节省大量宝贵的构建时间! (2认同)