从git repo恢复所有文件,并将它们的sha1或日期附加到文件名中?

时间:2014-04-24 02:16:20

标签: git

假设我有一个看起来像这样的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附加到他们的名字上。

这可能吗?

1 个答案:

答案 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