8

我有一个中央 Git 裸存储库。当对该仓库进行推送时,我想运行一个接收后挂钩。该钩子将做的是在 Basecamp 项目上创建一条消息(使用他们的 API)。我想要有关刚刚执行的更新的信息。现在我认为git log -2 --stat已经足够好了,但想要更多信息(更新的分支、创建的文件、删除的文件)。任何人都可以帮助我获取所有信息所需的命令吗?执行多个命令对我来说很好,可能没有一个命令可以让我获得所有信息。

4

3 回答 3

3

您可以通过检查和排序下的文件来找到最新的提交.git/refs/heads:每次进行新的提交时,相应的refs/heads文件都会更改,即提交到时masterrefs/heads/master会更新。

所以,让我们开发一个解决方案。

第一个任务:找到所有分支(即下的所有文件refs/heads并在它们最后一次更改时打印出来。你在谈论钩子,所以我们给出相对于.git/hooks目录的路径:

find ../refs/heads -type f -printf '%T@ %p\n'

这将生成所有分支及其更改日期的列表。有关参数的说明,请参见手册页。find

第二个任务:对得到的列表进行排序

find ../refs/heads -type f -printf '%T@ %p\n' |\
sort

第三个任务:我们需要该列表中的最新元素。由于sort从旧到新排序,我们想要的项目位于列表的底部。获取此元素tail(只有一项,因此传递-1标志):

find ../refs/heads -type f -printf '%T@ %p\n' |\
sort    |\
tail -1

第四项任务:在获得的行中删除日期。从我们的printf声明中我们知道日期和路径用空格分隔。将此作为分隔符输入cut( -d " ") 并告诉它我们需要第二个字段(即文件路径,-f 2)。为方便起见,我们将此文件路径存储在一个名为 的变量中$LATESTHEAD

LATESTHEAD=$(\
    find ../refs/heads -type f -printf '%T@ %p\n' |\
    sort    |\
    tail -1 |\
    cut -d ' ' -f 2 )

第五项任务:现在我们知道文件名,但我们需要内容。这是可以传递给git log. cat做这项工作。将最新版本存储在$LATESTREV

LATESTHEAD=$(\
    find ../refs/heads -type f -printf '%T@ %p\n' |\
    sort    |\
    tail -1 |\
    cut -d ' ' -f 2 )
LATESTREV=$(cat $LATESTHEAD)

现在,你可以$LATESTREV用来做任何你想做的脏事。

也许不是最优雅的解决方案(可能有人会过来告诉你一个更简单的单行),但对我有用。

于 2012-06-22T05:45:25.887 回答
2

添加--summary到您的 git 日志将生成新的和已删除的文件列表(git 将它们称为“节点”):

git log --stat --summary -1

要获取分支,请尝试运行:

git branch --contains `git log --oneline -1 |cut -f1 -d\ ` |cut -b3-

注意:我正在我的 mac 上测试这个。Unixcut是 1 索引,但我相信 Debiancut是 0 索引。如果是这样,并且如果您在 Debian 机器上,请更改-f1-f0并且分支命令应该可以正常工作

于 2012-06-22T06:05:06.817 回答
2

如果没有具体原因使用post-receive,我宁愿建议使用update,它将旧 ref、新 ref 和分支作为命令行参数。

git log因此,您可以使用此处建议的命令并oldref..newref作为参数给出(分别替换oldref和)来获取整个日志newref

有关更多信息,请参阅更新挂钩上的 githooks(5) 手册页。如果需要,您甚至可以在此时中止更新。

post-receive实际上,您在标准输入的钩子中获得了相同的信息。我不明白为什么您需要执行大量find命令来完成该任务。

于 2012-06-22T13:19:51.887 回答