Хорошо, я собираюсь выйти на конечность и предположить, что все ваши пронумерованные файлы совпадают - т.е. 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"