git是否有像`svn propset svn:keywords`或pre / post-commit的钩子?
通过浏览git文档,我看不到任何类似于SVN的提交钩子或“propset”function的东西,比如,只要将文件提交到存储库,就可以更新文件中的版本号或版权声明。
git用户是否希望为这种function编写外部脚本(这看起来没有什么问题)或者我错过了一些明显的东西?
编辑 :只是要清楚,我更感兴趣,例如,
svn propset svn:keywords "Author Date Id Revision" expl3.dtx
这里有一个string:
$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $
在发生提交时与相关信息保持同步。
引用Git FAQ :
git是否有关键字扩展?
不build议。 关键字扩展会导致各种各样的奇怪问题,而且无论如何都不是很有用,特别是在SCM的背景下。 在git之外,你可以使用脚本来执行关键字扩展。 Linux内核导出脚本这样做是为了在Makefile中设置EXTRA_VERSIONvariables。
如果你真的想这样做,请参阅gitattributes(5)。 如果你的翻译是不可逆的(例如SCCS关键字扩展),这可能是有问题的。
我在其他地方写了一个相当完整的答案 ,代码展示了如何去做。 总结:
- 你可能不想这样做。 使用
git describe
是一个合理的select。 - 如果你需要这样做,
$Id$
和$Format$
是相当容易的。 - 任何更高级的将需要使用
gitattributes
和自定义filter。 我提供了一个$Date$
的示例实现。
基于钩子函数的解决scheme通常是没有帮助的,因为它们使你的工作副本变脏。
Git有预先提交和提交后的钩子,它们位于每个.git / hooks目录中。 只需修改这些文件,然后chmod使它们可执行。
也许最常见的SVN属性'svn:ignore'是通过.gitignore文件而不是元数据来完成的。 恐怕对其他types的元数据没有任何帮助。
虽然是一个古老的问答。 我想我会扔一个,因为这已经困扰了我很长一段时间。
我习惯用倒序时间顺序列出目录中的文件(有趣的是,呃?)。 原因是我想看看我最近有哪些文件(或其他人)有变化。
Git会搞砸我的计划,因为切换分支时,本地回购将完全覆盖从追加的本地回购(增量…我知道…)复制的跟踪文件。
这样,所有签出的文件将带有结账的时间戳,并不会反映他们上次的修改时间…..是多么令人讨厌。
所以,我已经devise了一个bash中的单行程序,它将根据它在文件系统上的内容更新任何文件中的$ Date:$属性,以便我可以立即了解上次修改的状态而不必浏览git log
, git show
或任何其他工具,在非主stream模式下给出提交时间。
以下过程将仅修改将要提交到回购的跟踪文件中的$ Date:$关键字。 它使用git diff --name-only
这将列出被修改的文件,没有别的….
我在提交代码之前手动使用这一行。 有一件事是,我必须导航到回购的根目录之前应用此。
这里是Linux的代码变体(为了可读性而粘贴成多行)
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
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