【问题标题】:Export every revision of a single file from a Git repository?从 Git 存储库中导出单个文件的每个修订版?
【发布时间】:2013-07-11 15:17:00
【问题描述】:

我的项目中有一个文档 .ai 文件版本,现在我想导出 Git 存储库为该文件保存的每个“快照”

任何批处理/半自动解决方案?

我有大量的提交,并没有太多打算逐个导出它们。

【问题讨论】:

  • define "export" -- 你想让它们在另一个 git repo 中吗?在 TAR 档案中?在文件夹中?在服务器上?

标签: git shell repository export revision


【解决方案1】:

很快,但是因为没有其他人想出什么东西:

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 而增加。

P.S.:不要忘记在此之后更新 FILE (git checkout HEAD $FILE) 并且不要将文件夹快照添加到您的 repository。 :)

【讨论】:

  • 谢谢,一定会试试这些。
  • 他们似乎 - prntscr.com/1f08t1 - 不按时间顺序排列。如何确保正确的订单?你能编辑答案吗?
  • 它们是按时间顺序创建的,但很可能比文件系统的时间戳分辨率更快(例如 ext2/ext3 为 1 秒 - 不了解 MAC OS)或仅文件浏览器根据秒而不是毫秒对文件进行排序。我将编辑答案并添加一个前缀,显示文件的顺序。
  • 我还在循环之后添加了一个 HEAD checkout 以保持原始文件不变。
  • 我不是要抢你的时间,但是你能帮我实现第二个功能吗? gist.github.com/eppz/5986026 拥有此功能但与整个项目。一些带有 --no-checkout 或其他东西的本地克隆......
【解决方案2】:

要将文件的所有修订版导出到给定文件夹,您可以在 Bash 中使用此循环:

for sha in `git rev-list HEAD -- path/to/file`; do
    git show ${sha}:path/to/file > path/to/exportfolder/${sha}_doc.ai
done

当然,您可以自定义它。

将 sn-p 复制到一个文本文件中,并将 path/to/file 替换为您要导出的文件的实际路径(在 repo 中)。将path/to/exportfolder 替换为要将文件导出到的实际路径(导出文件夹必须存在)。您也可以修改导出的文件名,在这个版本中它使用格式“_doc.ai”;如果您想使用带空格的文件或路径名,请确保使用引号。

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

【讨论】:

  • 谢谢,一定会试试这些。
  • 这是一个比使用checkout 的版本更好的解决方案,因为它不会与当前版本混淆。警告代码运行器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多