我有一个脚本,可以从我的远程服务器的git库复制一些文件。对于每个被复制的文件,如果它在版本控制中,我想要生成一行,例如:
Filename: <filename>, commit: <last-commit-hash>, date: <date of last commit>
我的想法是将这些行存储在文件中,并将其复制到远程服务器上。这样我就可以始终知道服务器上的哪个文件属于我的 git 存储库中的哪个提交。 有没有快速的方法来做到这一点?
我对这个东西的用处持怀疑态度,因为你总是可以从本地仓库或GitWeb中获取信息,但是既然在这里了,那就给你:
git ls-files | while read file; do git log -n 1 --pretty="Filename: $file, commit: %h, date: %ad" -- $file; done
%h
会给你一个简略的哈希值;如果你想要完整的哈希值,可以使用%H
。你也可以通过--date=local|iso|rfc|short
调整日期格式(详见git-log手册页面)。
我在#git
频道和几个人聊过这个问题,其中一个人(谢谢Mikachu)找到了这个Perl脚本,它有正确的算法但是实现存在一些严重的缺陷。
所以我修复了这个脚本中的问题,大幅度整理了代码,并生成了结果 (从这里下载)。注意,它当前需要Term::ANSIColor
才能运行。下面可以看到它运行的截图:
(来源:adamspiers.org)
希望这对你有所帮助!
这种方法更快,而且可以按年龄排序:
find <dir> -exec git log -n 1 --pretty="%ai {}" "{}" \; | sort -r
git log
的结果。它打印的每一行看起来像2019-03-08 17:20:47 +0100 ./keymaps/henrebotha/keymap.c
,其中不包含提交哈希、分支名称或与Git相关的其他任何内容。 - henrebotha
git checkout <sha1>
将整个工作树恢复到该状态,或者使用git show <sha1>:<path>
查看一个文件的内容。 - Cascabelgit diff <published-commit> HEAD <file>
。真的没有必要知道它上次更改的时间。 - Cascabel