git - 在预提交 shell 脚本中调用 git diff

标签 git bash sh

我尝试将“git diff”的输出放入 shell 脚本中的变量中以检查文件是否已更改,但是当在脚本中运行“git diff file”时,我总是得到以下输出:

usage: git diff [--no-index] <path> <path>

这是我在脚本中调用的内容

#!/bin/sh
cd /path/to/repo
jsdiff=`git diff file.js`
echo "jsdiff: $jsdiff"

有什么想法吗?

#!/bin/sh
#
# this script is always executed before the commit is typed
#
#

# Before commiting minify and compress javascript if changed

cd /path/to/repo/_js
jsdiff=`git diff main.js`
echo "jsdiff: $jsdiff"

#if [ "$jsdiff" != "" ]
#   then
        # compile js
#       ./googleClosureCompile.sh
#       echo "js minified"
#fi

exit 0;

最佳答案

只有当您在不是存储库的目录中运行 git diff 时,您才会收到此错误,因此 git diff 认为您想使用它作为替代品对于普通的 diff,所以它需要两个路径。

这里的问题是,在钩子(Hook)内部 $GIT_DIR 总是设置为 .git 因此,而不是尝试简单地发现这个目录 git查看.git。如果你cd某处即使在你的存储库中git也不会找到这个.git目录,它会认为它不在 repo 协议(protocol)中。因此,您能做的最简单的事情就是避免在钩子(Hook)中使用 cd

而不是

cd /path/to/repo/_js
jsdiff=`git diff main.js`

只做

jsdiff=`git diff _js/main.js`

此外,最好检查 git diff 退出代码。操作方法如下:

#!/bin/sh

git diff --quiet _js/main.js || {
    # compile js
    # ...
}

关于git - 在预提交 shell 脚本中调用 git diff,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17047286/

相关文章:

GitHub:权限被拒绝(公钥)。 fatal: 远端意外挂断

bash - 在 awk printf 中使用可变长度的提示

bash - Bash 中的数组交集

git - 如何将 clang-formatting 添加到预提交 Hook ?

git - 有没有提供 Git 信息的 Leiningen 插件?

git - 如何解决 git status "Unmerged paths:"?

linux - zcat 文件不适用于 gzip 文件

bash - sh:测试文件是否存在

Bash 脚本无法从列表中下载源包

javascript - 在 React 中 - 如何从 .sh(Shell 脚本)文件中获取值?