假设我有一个看起来像这样的git仓库
commit #b97bd247a5d2530949c7acad0868e961c7777a28 Date: 2014-04-24 Time: 07:43
file1.txt
file2.txt
commit #4c1eb3b06dd4e51bf8541e67ec5dd8ad2744c695 Date: 2014-04-23 Time: 06:32
file1.txt
我想恢复所有文件(file1.exe
的两个副本)并将其恢复到目录结构中,如下所示:
file1_201404240743_b97bd247a5d2530949c7acad0868e961c7777a28.txt
file2_201404240743_b97bd247a5d2530949c7acad0868e961c7777a28.txt
file1_201404230632_4c1eb3b06dd4e51bf8541e67ec5dd8ad2744c695.txt
将各自的日期和#sha1附加到他们的名字上。
这可能吗?
答案 0 :(得分:0)
git没有内置任何内容,但在shell脚本中很容易做到。例如,假设您想要cd /tmp; mkdir restore; cd restore
,然后执行以上某些提交:
export GIT_DIR=/path/to/repo.git
for commit_id in $(git rev-list ...) # put specs for desired revs here
do
cdate=$(git show -s --pretty=format:%cd $commit_id)
echo "retrieve files from commit $commit_id on $cdate"
for file in $(git ls-tree --name-only -r $commit_id); do
git show ${commit_id}:${file} > ${file}_${cdate}_${commit_id}
done
done
请注意,这不会在" name"之间插入。和"扩展" part:例如,你会得到file1.txt_201404230623_b97bd247a5d2530949c7acad0868e961c7777a28
。对于子目录中的文件,重定向(> ...
)将失败,因为该目录也不存在。要解决这些问题(如果需要修复),请使用mkdir -p
根据需要创建目录,并使用正则表达式或其他类似技术将文件名拆分为" name"和"扩展"部分,并插入提交日期$cdate
和commit-id $commit_id
。