4

我尝试在 GIT 中实现预接收挂钩,以防止大尺寸文件和指定的扩展文件(*.jar、*.zip)。

pre-receive 钩子为接收操作执行一次。它不接受任何参数,但对于每个要更新的 ref,它会在标准输入上接收以下格式的一行:

(旧值) SP (新值) SP (参考名称) LF

其中 (old-value) 是存储在 ref 中的旧对象名称,(new-value) 是要存储在 ref 中的新对象名称,(ref-name) 是 ref 的全名。当创建一个新的 ref 时,(旧值)是 40 0。

如果用户更新现有分支中的文件,我们可以使用“git diff”命令获取更新文件列表。然后我只需要检查更新的文件。

但是对于新分支的创建,用户可以基于现有的提交创建一个新的分支,并在本地存储库中进行一些更改,然后推送。对于这种情况,我只想检查现有提交后所做的更改使用。任何 GIT 命令都可以帮助找出新分支的来源?

例如,用户根据分支 1 中的最新提交创建分支 2。之后,创建 commit2 和 commit3。然后推分支 2。

在钩子中,(旧值)是 40 0;(新值)是 commit3;(ref-name) 是 branch2。我想得到commit1。

提交3--分支2

提交2

提交1——分支1

4

1 回答 1

2

我认为您正在寻找之前被推送的最近的祖先。但是,如果正在推送合并,则可能有多个这样的祖先。所以我认为你想检查这个命令输出的每个提交的差异:

git rev-list --boundary <new-commit> --not --all | sed -n 's/^-//p'
于 2012-11-04T21:45:19.353 回答