代码之家  ›  专栏  ›  技术社区  ›  gies0r

如何将文件的所有git版本保存到磁盘?

  •  1
  • gies0r  · 技术社区  · 4 年前

    拥有一个 file.py 它在git中有三个版本,有三个唯一的提交哈希。

    那么,我如何以编程方式将所有版本还原到特定文件中,例如:

    0_<git_hash>_file.py
    1_<git_hash>_file.py
    2_<git_hash>_file.py
    

    解决方案不一定是Python,而是研究Python git 目前包。

    1 回复  |  直到 4 年前
        1
  •  3
  •   jthill    4 年前
    n=0
    git log --pretty= --diff-filter=d --raw -- $file | 
    while read m1 m2 h1 h2 rest; do
            eval git show $h2 > $((n++))_${h2}.$file
    done
    

    n=0
    git log --pretty=%h --diff-filter=d -- $file |
    while read; do
            eval git show $REPLY:$file > $((n++))_$REPLY.$file
    done
    

    这取决于您希望在生成的文件名中使用blob的哈希还是提交的哈希。

        2
  •  0
  •   Keith Thompson    4 年前

    您可以使用以下命令获取文件的指定版本,而无需签出相应的提交 git show 例如:

    git show git_hash:./file.py
    

    将打印以下内容 file.py 从指定的提交到标准输出。(据推测,我没有使用过的Git Python接口也提供了类似的功能。) ./ 在某些情况下避免了路径解析问题(我不记得细节了)。

    我写了一个Perl脚本,可以为几个不同的版本控制系统(其中大多数我不再使用)做这种事情: https://github.com/Keith-S-Thompson/get-versions (无担保)。

    根据要求,以下是一个运行示例 get-versions 在其自己的回购副本上:

    $ ls -l
    total 56
    -rw-r--r-- 1 kst kst 18092 Aug  9  2015 COPYING
    -rw-r--r-- 1 kst kst  6234 Apr 16  2018 README.md
    -rw-r--r-- 1 kst kst   940 Apr 25  2018 TODO.md
    -rwxr-xr-x 1 kst kst 20977 Apr 16  2018 get-versions
    $ get-versions -pad 3 -last 3 get-versions 
    $ ls -l
    total 128
    -rw-r--r-- 1 kst kst 18092 Aug  9  2015 COPYING
    -rw-r--r-- 1 kst kst  6234 Apr 16  2018 README.md
    -rw-r--r-- 1 kst kst   940 Apr 25  2018 TODO.md
    -rwxr-xr-x 1 kst kst 20977 Apr 16  2018 get-versions
    -r--r--r-- 1 kst kst 20752 Mar  2 10:54 get-versions,012
    -r--r--r-- 1 kst kst 20766 Mar  2 10:54 get-versions,013
    -r--r--r-- 1 kst kst 20977 Mar  2 10:54 get-versions,014
    $ 
    

    get-versions -help 打印一条过于冗长的使用信息。(添加手册页和保留执行权限都在我的TODO列表中。)

        3
  •  0
  •   Keith Thompson    4 年前

    使用git rev-list获取提交列表,git show输出文件:

    i=0; git rev-list --abbrev-commit HEAD | 
    while read sha; do
        git show $sha:./file.py > $((i++))_${sha}_file.py
    done
    

    此版本可能会避免以下问题 i++ 在子shell中执行且不影响父进程:

    i=0; git rev-list --abbrev-commit HEAD |
    while read sha; do
        git show $sha:./file.py > ${i}_${sha}_file.py
        ((i++))
    done