B T*_*B T 49
是的,Metastore或git-cache-meta 可以存储这样的(元)信息!Git本身,没有第三方工具,不能.Metastore或git-cache-meta可以存储文件的任何文件元数据.
这是设计,因为metaore或git-cache-meta旨在用于此目的,以及支持备份实用程序和同步工具.
(对不起,只是对Jakub的回答有点乐趣)
Die*_*Epp 43
我相信Git数据库中记录的唯一时间戳是作者和提交时间戳.我没有看到Git修改文件的时间戳以匹配最近提交的选项,并且这不是默认行为(因为如果是,Makefile将无法正常工作).
您可以编写一个脚本来将文件的修改日期设置为最近提交的时间.它可能看起来像这样:
IFS="
"
for FILE in $(git ls-files)
do
TIME=$(git log --pretty=format:%cd -n 1 --date=iso -- "$FILE")
TIME=$(date -j -f '%Y-%m-%d %H:%M:%S %z' "$TIME" +%Y%m%d%H%M.%S)
touch -m -t "$TIME" "$FILE"
done
Run Code Online (Sandbox Code Playgroud)
Jak*_*ski 37
不,Git根本不存储此类(元)信息,除非您使用第三方工具,如metastore或git-cache-meta.存储的唯一时间戳是创建时间补丁/更改(作者时间),以及创建时间提交(提交者时间).
这是设计,因为Git是版本控制系统,而不是备份实用程序或同步工具.
Mes*_*ion 11
这个python脚本可能会有所帮助:对于每个文件,应用修改文件的最新提交的时间戳:
下面是一个非常简单的脚本版本.对于实际使用,我强烈建议使用上面一个更强大的版本:
#!/usr/bin/env python
# Bare-bones version. Current dir must be top-level of work tree.
# Usage: git-restore-mtime-bare [pathspecs...]
# By default update all files
# Example: to only update only the README and files in ./doc:
# git-restore-mtime-bare README doc
import subprocess, shlex
import sys, os.path
filelist = set()
for path in (sys.argv[1:] or [os.path.curdir]):
if os.path.isfile(path) or os.path.islink(path):
filelist.add(os.path.relpath(path))
elif os.path.isdir(path):
for root, subdirs, files in os.walk(path):
if '.git' in subdirs:
subdirs.remove('.git')
for file in files:
filelist.add(os.path.relpath(os.path.join(root, file)))
mtime = 0
gitobj = subprocess.Popen(shlex.split('git whatchanged --pretty=%at'),
stdout=subprocess.PIPE)
for line in gitobj.stdout:
line = line.strip()
if not line: continue
if line.startswith(':'):
file = line.split('\t')[-1]
if file in filelist:
filelist.remove(file)
#print mtime, file
os.utime(file, (mtime, mtime))
else:
mtime = long(line)
# All files done?
if not filelist:
break
Run Code Online (Sandbox Code Playgroud)
所有版本都会解析单个git whatchanged命令生成的完整日志,这比每个文件的填充速度快数百倍.git(24,000次提交,2,500个文件)不到4秒,linux内核不到1分钟(40,000个文件,300,000次提交)
这对我来说就是ubuntu(在日期(1)缺少OSX的"-j"标志)
for FILE in $(git ls-files)
do
TIME=$(git log --pretty=format:%cd -n 1 --date=iso $FILE)
TIME2=`echo $TIME | sed 's/-//g;s/ //;s/://;s/:/\./;s/ .*//'`
touch -m -t $TIME2 $FILE
done
Run Code Online (Sandbox Code Playgroud)
Native Git不具备该功能,但可以通过hook脚本或第三方工具来实现。
我试过了metastore。它非常快,但我不喜欢需要安装,并且元数据不以纯文本格式存储。git-cache-meta是我尝试过的一个简单工具,但对于大型存储库来说速度非常慢(对于具有数万个文件的存储库,更新元数据文件需要几分钟),并且可能存在跨平台兼容性问题。setgitperms其他方法也有我不喜欢的缺点。
最后,我为这项工作制作了一个钩子脚本:git-store-meta。它具有非常轻的依赖性(*nix shell、sort、 和perl,这是 Git 所必需的,以及可选的chown、chgrp和touch),因此对于可以运行 Git 的平台来说不需要安装任何额外的东西,具有理想的性能(对于具有数十个的存储库)数千个文件,更新元数据文件需要 < 10 秒;尽管创建时间更长),以纯文本格式保存数据,并且可以自定义要“保存”或“加载”的元数据。
它对我来说效果很好。如果您对 Metastore、git-cache-meta 和其他方法不满意,请尝试此操作。
| 归档时间: |
|
| 查看次数: |
33254 次 |
| 最近记录: |