git能够直接从源文件获取提交消息吗?

git能够直接从源文件获取提交消息吗?,git,hook,message,commit,Git,Hook,Message,Commit,我正在寻找一种直接从提交的源文件中提取git提交消息的方法,而无需调用编辑器或类似工具 我们的部门刚刚开始使用git,出于遗留原因,所做的更改写在源文件的顶部: #!/usr/local/bin/php <?php // // @(#)insert_AX_serialno.php Arrow/ECS/EMEA/EA/nb 1.6 2018-03-14, 13:41:20 CET // // V 1.6: Now also check the Warehouse

我正在寻找一种直接从提交的源文件中提取git提交消息的方法,而无需调用编辑器或类似工具

我们的部门刚刚开始使用git,出于遗留原因,所做的更改写在源文件的顶部:

#!/usr/local/bin/php
<?php
//
// @(#)insert_AX_serialno.php   Arrow/ECS/EMEA/EA/nb    1.6     2018-03-14, 13:41:20 CET
//
// V 1.6:       Now also check the Warehouse Code of an item before inserting the serial
// 2018-03-07   number. The Warehouse Code must not be equal to any of three values (see below).
//
// V 1.5:       Now also check the Storage Dimensiaon of an item before inserting the serial
// 2018-03-07   number. The Storage Dimension must be equal to the constant "PHYSICAL".
//
// V 1.4:       introduced an "Environment" variable which determines the target of the GetAXPO...
// 2018-02-21   functions (DEV, UAT or PROD). The variable can either be set explicitly or gets
//              its value from the $_ENV array.
//
// V 1.3:       stop processing if a line does not have the necessary Approval Status and
// 2018-02-20   PO Status
//
// V 1.2:       Every insert requires now a RECID; either for the line or for the header.
// 2017-12-20   So we're selecting the RECID from the AX table if it's not provided as
#/usr/local/bin/php
我能从githooks手册页中摘录的只是,我可以用一个钩子来准备消息,但不能替换它

您可以以任何方式准备邮件,包括完全替换邮件

1) 钩子是否知道正在提交哪些文件

不需要,但您可以查询git本身。新提交的文件位于索引中。使用命令
git diff--name only
列出文件

2) 钩子可以从源文件中准备消息文件吗

不,但是你可以自己写剧本

让git使用该文件而不是打开编辑器(当然不使用“-m”参数)

否。当
git
执行
prepare commit msg
hook时,下一步总是打开编辑器

通过使用显式选项
git commit--no edit
,可以防止打开编辑器。或者,您可以在提交之前使用提交消息准备一个文件,而不使用
prepare commit msg
hook,只调用
git commit-F message.txt

我能从githooks手册页中摘录的只是,我可以用一个钩子来准备消息,但不能替换它

您可以以任何方式准备邮件,包括完全替换邮件

1) 钩子是否知道正在提交哪些文件

不需要,但您可以查询git本身。新提交的文件位于索引中。使用命令
git diff--name only
列出文件

2) 钩子可以从源文件中准备消息文件吗

不,但是你可以自己写剧本

让git使用该文件而不是打开编辑器(当然不使用“-m”参数)

否。当
git
执行
prepare commit msg
hook时,下一步总是打开编辑器

通过使用显式选项
git commit--no edit
,可以防止打开编辑器。或者,您可以在提交之前使用提交消息准备一个文件,而不使用
prepare commit msg
hook,而是在我还在AFK时调用
git commit-F message.txt

,您也应该查看它,但我想完成这个,所以:

我是git新手,我能从githooks手册页中摘录的只是我可以用钩子准备消息,但不能替换它

事实并非如此——prepare-commit-msg钩子可以对消息文件执行任何它喜欢的操作,包括完全替换其内容。但是,您可能将消息文件(通常只是
.git/COMMIT\u EDITMSG
)与
git log
稍后显示的内容(不是
.git/COMMIT\u EDITMSG
)混为一谈

要了解发生了什么(以及您需要做什么),您需要了解Git在提交中实际放了什么,以及提交是如何工作的

首先,您所做的每一次提交至少在逻辑上都包含一个完整、独立的快照,与每一次其他提交分离。也就是说,通过从某个顶级目录开始并枚举其中的文件和目录,可以找到一些文件和目录的源代码树。2 Git提交所有文件,包括子目录中的文件。3

因此,如果您有Git存储库,您可以运行:

git log
要查看各种提交,请按哈希ID选择一个(例如,使用鼠标剪切和粘贴),然后运行:

此提交的日志消息是最后一行。它位于提交对象中,即散列ID为e3a80781f5932f5fea12a49eb06f3ade4ed8945c的对象。如果我在提交时运行
git show
,git会告诉我有关
文档/RelNotes/2.17.0.txt
,但事实上,提交中的文件是
树8e229ef2136e53a530ef74802f83d3b29a225439中的文件。如果我运行git ls tree-r 8e229ef2136e53a530ef74802f83d3b29a225439
,它将生成3222行输出:

$ git ls-tree -r 8e229ef2136e53a530ef74802f83d3b29a225439 | wc
    3222   12900  259436
因此,提交中有3000多个文件。其中3221个文件与父级中的版本100%相同,即
66023bbd78fe93c4704b3df754f9f7dc619ebaad
,其中也包含3222个文件

无论如何,这里的关键点是:

  • 提交是Git对象:四种类型之一。完整的集合添加了树、blob(仅文件数据:文件名(如果有)则位于树对象中)和带注释的标记。最后一个与此无关
  • 每个提交都有一组父提交(通常只有一个)
  • 每次提交保存一棵树。该树列出了文件名及其blob哈希ID。您可以尝试使用
    gitls-tree
    (并阅读其文档)来了解它们是如何工作的,但在这个级别上,细节是不相关的
  • 每个提交还具有其关联但用户提供的元数据:作者和提交者(名称、电子邮件和时间戳),以及从钩子可以编辑的消息文件复制的日志消息
因此,进行提交是一个涉及构建树对象以用作快照,然后添加元数据以进行新提交的过程。新提交得到一个新的、唯一的散列ID。(树ID不一定是唯一的:如果您进行的新提交与以前的某个提交具有完全相同的树,这有时是明智的做法,那么您将重新使用旧的树。)


1实际上,Git确实开始做与其他版本控制系统相同的增量压缩。但这种情况在提交完成完整的独立快照之后很久才会发生

2这是一个近似值。有关更多详细信息,请参见下一节

3Git不保存任何目录:它提交
$ git rev-parse HEAD
e3a80781f5932f5fea12a49eb06f3ade4ed8945c
$ git cat-file -p e3a80781f5932f5fea12a49eb06f3ade4ed8945c | sed 's/@/ /'
tree 8e229ef2136e53a530ef74802f83d3b29a225439
parent 66023bbd78fe93c4704b3df754f9f7dc619ebaad
author Junio C Hamano <gitster pobox.com> 1519245935 -0800
committer Junio C Hamano <gitster pobox.com> 1519245935 -0800

Fourth batch for 2.17
$ git ls-tree -r 8e229ef2136e53a530ef74802f83d3b29a225439 | wc
    3222   12900  259436
:100644 100644 f5debcd2b4f05c50d5e70efc95d10d95ca6372cd e736da45f71a37b46d5d46056b74070f0f3d488a M      wt-status.c
$ git diff-index -r --name-status HEAD
M       wt-status.c
git diff-index -r --name-status HEAD | while read status path; do ...
$ git diff-index --cached -p HEAD -- wt-status.c
diff --git a/wt-status.c b/wt-status.c
index f5debcd2b..e736da45f 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1,3 +1,4 @@
+
 #include "cache.h"
 #include "wt-status.h"
 #include "object.h"