从Git仓库中导出单个文件的每个修订版本?

7
我有一个文档.ai文件与我的项目一起进行版本控制,现在我想要导出Git存储库中保存的该文件的每个“快照”。
有批处理/半自动化解决方案吗?
我有大量提交,不想逐个导出。

定义“导出” - 您想将它们放在另一个git存储库中吗?在TAR归档中?在文件夹中?在服务器上? - Nevik Rehnel
2个回答

12

要将文件的所有版本导出到指定文件夹,您可以在Bash中使用以下循环:

for rev in $(svn log -q FILENAME | awk '/^r[0-9]+/ {print substr($1, 2)}'); do
    svn cat -r $rev FILENAME > /path/to/folder/FILENAME.$rev
done
for sha in `git rev-list HEAD -- path/to/file`; do
    git show ${sha}:path/to/file > path/to/exportfolder/${sha}_doc.ai
done

当然,您可以自定义此内容。

将片段复制到文本文件中,并使用实际文件的路径替换path/to/file。将path/to/exportfolder替换为要将文件导出到的位置的实际路径(导出文件夹必须存在)。您还可以修改导出的文件名,在此版本中它使用格式"_doc.ai"; 只需确保在使用带有空格的文件或路径名时使用引号。

此版本将从当前检出的修订版(HEAD)开始,并遍历从HEAD在祖先树中可到达的所有修订版历史记录。这意味着您应该检出要从其中开始导出的最新修订版。


谢谢,我一定会尝试这些的。 - Geri Borbás
1
这是比使用“checkout”版本更好的解决方案,因为它不会影响当前版本。注意代码运行者。 - Ari B. Friedman

7

很快,但既然没有其他人想到了什么:

mkdir snapshots
FILE=YourFile.ai
i=1
for COMMIT in $(git log --oneline $FILE | cut -f 1 -d " "); do 
  git checkout $COMMIT $FILE; 
  cp $FILE snapshots/$i-$COMMIT.ai; 
  (( i = i + 1 ))
done

然后你的目录 snapshots 包含文件的所有版本。名称由数字 1..n 组成,随着每个版本的年龄增长而增加,以及相应的提交和文件扩展名 .ai
附注:之后不要忘记更新 FILEgit checkout HEAD $FILE),并且不要将 snapshots 文件夹添加到您的 repository 中。 :)

谢谢,我一定会尝试这些的。 - Geri Borbás
它们似乎不是按照时间顺序排列的。我该如何确保正确的顺序?你能编辑答案吗? - Geri Borbás
它们是按时间顺序创建的,但很可能比您的文件系统的时间戳分辨率更快(例如ext2/ext3的1秒 - 不知道MAC OS),或者文件浏览器仅基于秒而不是毫秒对文件进行排序。我将编辑答案并添加一个前缀,显示文件的顺序。 - Kornelius Rohmeyer
我还在循环后添加了一个HEAD checkout,以保持原始文件不变。 - Geri Borbás
我不打算浪费你的时间,但你能帮我实现第二个功能吗?https://gist.github.com/eppz/5986026 以便在整个项目中都能使用这个功能。可以使用一些本地克隆的命令,如--no-checkout或其他。 - Geri Borbás
谢谢您!我最终使用了这个,但我将“i=1”更改为“i=1000”,以确保文件按字母顺序排序。 - psmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接