我有一个裸露的远程存储库,其中包含源文件,我只想在推送到其中后才生成更改的文件。我认为检测哪个文件已更改的最好方法是通过输入以下命令
changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD)
插入接收后挂钩。
但是,正如我通过将其回显到文件中所验证的那样,该变量最终为空。如果我放HEAD ^而不是HEAD,它会显示第二次提交到最近一次提交的更改文件。但是,当我放置HEAD时,它不会显示最新的更改,而什么也不显示。
有人可以帮助我吗?还是有一种更聪明的方法来解决我的问题?
我绝对希望使用精益方法,例如通过自动触发构建来推动构建,而这将不得不执行。 G。定期检查更改。
答案 0 :(得分:3)
在执行post-receive
钩子时,所有引用都已更新。因此,HEAD
表示新的头,而不是旧的头。
这可能不会产生您想要的结果,因为它假定有一个非合并提交,并且您想与它的父提交进行比较,而您可能已推送了一个合并或多个提交。
您可能想做的就是利用提供旧值和新值的标准输入。当您按下时,类似以下内容的内容会将更改后的文件作为远程输出输出:
#!/bin/sh
while read old new ref
do
# Handle created or deleted branches.
echo $old | grep -qsE '^0+$' && old=$(git hash-object -t tree /dev/null)
echo $new | grep -qsE '^0+$' && new=$(git hash-object -t tree /dev/null)
git diff-tree --no-commit-id --name-only -r "$old" "$new"
done
答案 1 :(得分:1)
好的,我已经弄清楚了:我得到了
remote: fatal: ambiguous argument 'HEAD': both revision and filename
错误。更改后
changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD)
到
changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD --)
一切正常。显然,这是由于挂钩在远程存储库的.git
目录中执行而引起的,并且该目录中有一个名为HEAD
的文件,这将HEAD
修订版称为HEAD
不明确。