有没有一种简单的方法可以回顾性地将Emacs编号的软件版本转换为git版本?

时间:2011-03-10 00:13:39

标签: git version-control

我有一些来自开源项目的文件,我稍微编辑过,例如

 Makefile
 Makefile.~1~
 Makefile.~2~

这些编号版本由Emacs制作,带有编号版本控制,类似于VMS版本化文件

据我所知,Linux项目和Perl语言项目回顾性地将其最旧的版本置于版本控制之下。我想追溯性地将.tar.gz tarball文件和编号版本中的文件添加到版本控制系统中。

有没有相对容易或简单的方法来做这样的事情?我如何编写脚本来自动执行此过程?

1 个答案:

答案 0 :(得分:1)

好的,我将在这里假装您的编号文件全部匹配 - 即foo.~3~bar.~3~来自相同的整体版本。如果他们不是,我不知道你怎么可能有足够的信息来构建有意义的历史。当然,让我们假设所有这些编号的文件都在一个目录中,可能是你提到的那个tarball中的。

以下内容并不完美,但它确实适用于我的测试用例。 (它没有正确处理存在于一个版本中但不存在于下一个版本中的隐藏文件 - 如果您关心它,则将rm -rf *更改为更光亮的内容。)

#!/bin/bash

old_directory=/path/to/numbered_files_dir
repo_dir=/path/to/repo_to_create

empty_repo() {
    (
    cd "$repo_dir" &&
        rm -rf *
    )
}

commit_all() {
    (
    cd "$repo_dir" &&
    git add -A &&
    git commit -e -m "$1"
    )
}


mkdir -p "$repo_dir" && (cd "$repo_dir" && git init)

# note: sort -u gave incorrect results for me here. very strange.
for n in $(find "$old_directory" | grep -o '~[0-9]\+~$' | sort -rn | uniq); do
    echo "version $n"
    empty_repo
    for f in $(find "$old_directory" -type f -name "*.$n" -printf '%P\n'); do
        mkdir -p "$repo_dir/$(dirname "$f")"
        cp "$old_directory/$f" "$repo_dir/${f%.$n}"
    done
    commit_all "version $n"
done

empty_repo
for f in $(find $old_directory -type f -not -regex '.*\.~[0-9]+~$' -printf '%P\n'); do
    mkdir -p "$repo_dir/$(dirname "$f")"
    cp "$old_directory/$f" "$repo_dir/$f"
done
commit_all "final version"