浏览git文档时,我看不到类似于SVN的提交钩子或"属性"功能的任何东西,例如,只要将文件提交到存储库,它们就可以更新文件中的版本号或版权声明。
是git用户被期望为这种功能编写外部脚本(这似乎不是不可能的)还是我只是想念一些明显的东西?
编辑:只是要清楚一点,例如,我对
1
| svn propset svn:keywords"Author Date Id Revision" expl3.dtx |
像这样的字符串:
1
| $Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $ |
每当发生提交时,都会保持有关相关信息的最新信息。
我在其他地方写了一个相当完整的答案,其中的代码显示了如何做到这一点。总结:
您可能不想这样做。使用git describe是合理的选择。
如果确实需要执行此操作,则$Id$和$Format$相当简单。
任何更高级的操作都需要使用gitattributes和自定义过滤器。我提供了$Date$的示例实现。
基于挂钩函数的解决方案通常无济于事,因为它们会使您的工作副本变脏。
引用Git常见问题解答:
Does git have keyword expansion?
Not recommended. Keyword expansion causes all sorts of strange problems and
isn't really useful anyway, especially within the context of an SCM. Outside
git you may perform keyword expansion using a script. The Linux kernel export
script does this to set the EXTRA_VERSION variable in the Makefile.
See gitattributes(5) if you really want to do this. If your translation is not
reversible (eg SCCS keyword expansion) this may be problematic.
Git确实有预提交和后提交钩子,它们位于每个.git / hooks目录中。只需修改文件并对其进行chmod使其可执行即可。
尽管已有很长时间的问答。我以为我会扔进去,因为这困扰了我很长一段时间。
我习惯于按相反的时间顺序列出目录中的文件(很有趣,是吧?)。原因是我想查看最近(或其他任何人)更改过的文件。
Git会弄乱我的计划,因为当切换分支时,本地存储库将完全覆盖打包的本地存储库中的(增量...我知道...)副本中的跟踪文件。
这样,所有签出的文件将带有签出的时间戳,并且不会反映出它们的最后修改时间.....多么令人讨厌。
因此,我设计了一个bash的单行代码,它将根据文件系统上的最后修改时间来更新任何文件内的$ Date:$属性,以便我可以立即知道最近一次修改的状态无需浏览git log,git show或任何其他以非指责模式给出提交时间的工具。
以下过程将仅在将要提交到存储库的跟踪文件中修改$ Date:$关键字。它使用git diff --name-only将列出已修改的文件,仅此而已...。
在提交代码之前,我会手动使用此一线代码。不过,有一件事是我必须先应用到存储库的根目录。
这是Linux的代码变体(粘贴为多行以提高可读性)
1 2 3 4 5
| git diff --name-only | xargs stat -c"%n %Y" 2>/dev/null | \\
perl -pe 's/[^[:ascii:]]//g;' | while read l; do \\
set -- $l; f=$1; shift; d=$*; modif=`date -d"@$d"`; \\
perl -i.bak -pe 's/\\$Date: [\\w \\d\\/:,.)(+-]*\\$/\\$Date: '"$modif"'\\$/i' $f; \\
git add $f; done |
和OSX
1 2 3 4
| git diff --name-only | xargs stat -f"%N %Sm" | while read l; do \\
set -- $l; f=$1; shift; d=$*; modif=`date -j -f"%b %d %T %Y""$d"`; \\
perl -i.bak -pe 's/\\$Date: [\\w \\d\\/:,.)(+-]*\\$/\\$Date: '"$modif"'\\$/i' $f; \\
git add $f; done |
也许最常见的SVN属性" svn:ignore"是通过.gitignore文件而不是元数据完成的。恐怕我对其他类型的元数据没有更多帮助。