2

我已经在文件中启用了$Id:$via的扩展。这使我能够在其他人签出我的存储库并从那里安装它时快速确定文件是否已过时。ident.gitattributes

现在,我还将我自己的 Git 存储库的内容同步到其他(非开发,即没有 Git)系统。问题是关键字扩展只发生在checkout,但我的工作流程是commit -> push -> sync,所以同步的副本包含过时的 Id。

如何在本地提交后轻松强制更新 ID?(任何提交后自动执行此操作的奖励积分!)

一个简单的git checkout不起作用(也不起作用--force),可能是因为文件内容没有改变。也没有git checkout-index --force。我只能通过本地修改来实现这一点(很麻烦,需要知道修改后的文件):

$ echo "modified" >> file
$ git checkout file

或者通过临时签出之前的提交:

$ git checkout HEAD^
$ git checkout HEAD@{1}
4

3 回答 3

1

这里有一些建议:

git checkout --force .或许git checkout --force file.txt

如果其中一个命令有效,那么您可以创建一个脚本.git/hooks/post-commit并使该脚本成为调用该命令(或任何有效命令)的单行脚本,然后 git 将在每次提交时执行此操作。我相信钩子脚本会自动将工作目录的根目录(.git 文件夹所在的位置)设置为脚本的 cwd。

编辑:

如果你运行,touch file.txt; git checkout file.txt那么 git 将执行完整的检查,包括在我测试时应用 ident 属性。希望可以以某种方式使用

于 2012-11-19T16:33:14.990 回答
0

这可以通过提交后挂钩来完成。我已经通过一个脚本自动化了设置,该脚本作为我的git-extensions 存储库的一部分进行维护:

$ git-ident-update --help
Update the expansion of $Id$ to $Id:...$ via ident in the .gitattributes
after a commit.
To do this automatically in the future, invoke with --install.
Usage: git-ident-update [--install|--uninstall|--status|--set [<path>[ <path> ...]]] [-?|-h|--help]
于 2016-09-22T12:55:58.840 回答
0

我使用以下命令对最近更新的包含 git Id 的文件运行 touch 和 git checkout:

find . -type f -mtime -1 -a -not -name '*~' | \
   xargs grep -l '$Id:' | \
   xargs --replace --verbose sh -c '{ touch {} ; git checkout {}; }'
于 2020-04-10T23:55:21.647 回答