如何使用包含顺序版本代码的现有文件快速实现Git



随着我的R代码越来越长,越来越难管理,我正在尝试实现Git来改进我的工作流程。

我目前使用"另存为"和有意义的文件名保存代码的顺序版本,例如"Mycode-ver 0.1.01"、"Mycode-wer 0.1.02"、……、"Mycode-ver 0.1.25"。这可能是我们许多人在使用任何版本控制系统之前都会做的事情。

我做了什么:

我通过创建一个存储库开始迁移到Git,将所有25个R-脚本复制到文件夹中,然后从最早到最近依次提交每个脚本。

问题是:

我突然意识到,我可能做得不对:我认为,我实际上是在创建一个由25个独立文件组成的文件夹,而不是一个包含25个修订的R脚本的文件夹(这应该是正确的方式)。

因此,我的问题是:有没有一种方法可以快速正确地将我的代码的所有25个版本都放入Git

在这一点上,我只能考虑创建一个空文件,一次将所有25个文件的内容剪切并粘贴到其中,然后依次提交每个文件。这显然耗时且容易出错。

在开始之前,我浏览了Git文档(至少到了关于分支的chp3)和许多在线教程。虽然他们介绍了基本的Git概念,例如Git如何在每次提交、Git分支、合并等时对存储库中的文件进行快照,但我找不到关于如何在像我这样的项目处于中间时迁移的资源。

如果我的理解在任何方面都不正确,我谦卑地请求任何更正。提前感谢!

顺便说一句:我之所以使用SmartGit,是因为SO中的评论很容易学习,但我对使用Bash或任何其他GUI客户端的任何建议都持开放态度。

编辑:

我在WindowsXP上运行Git。

从您的问题来看,您正在处理一个文件的25个版本的,所以我认为是这样。我认为在这种简单的情况下,将修订版转换为git的最简单方法是基于一个看起来像的循环编写shell脚本

for x in `seq 1 25`; do
cp "Mycode - ver 0.1.`printf '%02d' "$x"`" "Mycode"
git add "Mycode"
git commit -m "revision $x"
done

当然,时间戳会非常接近。你可以做一些较低级别的git篡改来解决这个问题,但它需要"历史重写",所以在上传到公共repo之前就要这样做。

编辑:显然,只要稍微修改一下语法,你就可以在Windows批处理文件中很容易地编写相同的脚本。如果你呆在同一个目录中,你就不必担心反斜杠与正斜杠目录分隔符,等等…

这个答案适用于bash。只要安装了realpath,它就可以在任何操作系统上运行。

你只需要一个简单的脚本。希望按照上次修改日期(使用ls -tr,就像我在这里所做的那样)或名称的相反顺序对文件进行排序,应该会按照正确的顺序列出它们。类似这样的东西:

#! /bin/bash
orig_dir="$(realpath $1)"
desired_repo_name="$2"
desired_filename="$3"
mkdir "$desired_repo_name"
cd "$desired_repo_name"
git init
for file in $(ls -tr $orig_dir/*); do
cp "$file" "$desired_filename"
git add "$desired_filename"
git commit -m "Importing from $file"
done

使脚本可执行(我不确定这是否在Windows上的Cygwin上是必要的):

chmod +x script.sh

运行它:

./script.sh A B C

其中A是包含原始文件的目录,B是所需的存储库文件夹(脚本将创建该文件夹),C是用于文件所有版本的文件名。

这个脚本没有正确地给git修订打上日期戳——它们都会用当前日期打上日期标记。但是,添加该功能很容易。

也许其他人可以帮助你编写windows脚本,但如果你有bash,你可以做这样的事情:

find -iname 'MyCode*' | sort | while read f; do
cat "${f}" > MyCode.r; git add MyCode.r; git commit -a -m "$f";
done

最新更新