Есть ли простой способ ретроспективно превратить пронумерованные версии программного обеспечения Emacs в git-версии? - PullRequest
1 голос
/ 10 марта 2011

У меня есть несколько файлов из проекта с открытым исходным кодом, которые я несколько отредактировал, например,

 Makefile
 Makefile.~1~
 Makefile.~2~

Эти пронумерованные версии созданы Emacs с его пронумерованным контролем версий и похожи на файлы версий VMS

Я понимаю, что проект Linux и проект на языке Perl ретроспективно ставят свои самые старые версии под контроль версий. Я хотел бы ретроспективно добавить файлы без изменений из tar-файла .tar.gz и пронумерованных версий в систему с управлением версиями.

Есть ли относительно простой или простой способ сделать это? Как мне написать сценарий для автоматизации этого процесса?

1 Ответ

1 голос
/ 10 марта 2011

Хорошо, я собираюсь выйти на конечность и предположить, что все ваши пронумерованные файлы совпадают - т.е. foo.~3~ и bar.~3~ относятся к одной и той же общей версии.Если это не так, я не понимаю, как у вас, возможно, достаточно информации, чтобы построить значимую историю.И, конечно, давайте также предположим, что все эти пронумерованные файлы находятся в одном каталоге, возможно, заключены в тот архив, о котором вы упомянули.

Следующее не совсем идеально, но оно определенно сработало в моем тестовом примере.(Он не имеет должного отношения к скрытым файлам, которые существуют в одной версии, но не в следующей - замените это 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...