GIT:提交时在文件中包含当前提交哈希和最新标签

11

这可能更多是一个技巧性的问题:

我正在使用git版本控制,并使用rsync将文件传送到 PHP CMS 的测试或生产站点。现在,我想使用一个可靠且自动化的系统跟踪当前部署的提交,我正在考虑以下方法:

设置一个git挂钩来添加/更新文本文件,其中包含最新的标签和提交哈希值。然后我可以轻松查找提交记录。

我的问题是,在pre-commit阶段,脚本将无法知道提交哈希值。是否有任何直接的方法来完成这个任务(或达到同样目的的另一种方法)?

提前感谢您的贡献!


我认为你想在部署端处理这个问题。编写一个脚本来执行部署,然后让该脚本在复制文件之前将当前哈希值复制到每个文件的某个位置。 - Mason
很有趣,在发布问题后我恰好得到了那个想法。不过,让git处理版本文件会更好——这样无论部署如何处理都不会有问题。 - Martin Rasser
如果您尝试将版本信息存储在Git版本控制下的文件中,更新并提交,那么您将得到一个新的提交SHA1。 :) 您必须在Git之外完成此操作。 - Tuxdude
不,这在逻辑上是不可能的,你的解决方案行不通。将“当前”提交 ID 放入文件中必然会更改当前提交 ID。你最多只能将上一个提交 ID 放入文件中,但这样做将会大大降低其实用性。你真的,真的不应该试图使用 Git 来管理这个问题。 - user229044
3个回答

10

好的,我认为我已经有一个可以的解决方案:

有一个名为post-commit的git钩子,以下是我的做法:

  • 我将保存标签/哈希的文件放在了.gitignore中(以避免下次提交时进行不必要的更改)
  • 让post-commit钩子更新版本文件。

钩子文件的内容:

#!/bin/sh 
git describe --tags > version.txt 
现在我确信每次提交后文件都是最新的,只要在部署之前进行提交就可以了。
注意事项: 初学者需要注意:使挂钩文件可执行,否则git会在没有警告的情况下忽略该文件。
有关git挂钩的所有内容:http://git-scm.com/book/en/Customizing-Git-Git-Hooks 有关.gitignore的所有内容:http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository#Ignoring-Files 谢谢,
马丁

3

既然您正在使用rsync来部署代码,那么可以像这样操作:

$ git describe --long > VERSION.txt

然后,将 VERSION.txt 包含在 rsync 包中。

git describe 字符串的格式如下:

$ git describe --long
r1.0-2-gca93d0a

在上面的例子中:
  1. 最新标签是r1.0
  2. 2表示我们在该标签之后提交了两次
  3. g代表git(好吧,这有点奇怪,但没办法)
  4. 当前哈希值是ca93d0a

谢谢,看起来不错。发完我的答案后才看到你的答案 - 请查看使用 Git 解决问题的答案。想想看,让 rsync 脚本处理它有其优点,因为它确保版本文件是最新的。我甚至可以将 rsync 脚本推到一个地步,以实际禁止在工作副本中存在未提交的更改时进行部署。 - Martin Rasser
关于检查工作树是否存在杂项的想法很好。如果我的回答有用,你能否给我投票支持一下?我需要几个点数才能达到下一个级别。 - John Jesus

3
这是一个常见问题解答。
在gitattributes(5)中搜索export-subst,您需要使用git-archive(1)来完成替换。
(%H为散列值。要获取标签,仍需要调用git-describe(1)的脚本,我没有看到相关格式)。 链接

太好了!经过一些尝试,这是我的 .gitattributes 文件:version.txt export-subst。还有我的 version.txt 文件内容:$Format:%H$ - Peter Ehrlich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接