1

我有一个旧的遗留代码库,其版本保存在按日期标记的目录中......

...
../20110819/
../20120105/
...

几个月前我们搬到了 git,我从旧版本中进行了一些提交作为起点,并在此基础上进行了开发。

我有两个问题,第一个更重要:如何将这一系列目录转换为 git 提交?优选地,这将在脚本中自动化。

其次,如何将我所做的提交重新添加到顶部?

4

3 回答 3

2

伪代码:

git init newrepo
for each directory in the proper order (looks like you can just do a numeric sort there, unless there are exceptions to the naming convention)
do
  remove everything in newrepo except for .git
  copy entire contents of tree into newrepo, without the <date>/ prefix
  git add -A .
  git commit -m "some suitable message mentioning the date/version"
done

您可能可以通过正确使用git --git-dir=... --work-tree=...选项来跳过复制,但我通常只是针对类似情况完成了上述操作(当然,在我这样做的情况下,所有“版本”都从一个系列中解压缩档案,而不是生活在一系列目录中)。

于 2013-07-22T19:32:53.097 回答
1

这个扩展了贾斯汀的答案。之后的变基过程可能很复杂,所以我没有包括它。它相当于git rebase -i newroot master,但在合并/添加/删除方面存在细微差别。例如,我必须清理已删除的文件(这些文件不会被拾取,因为我们只是添加文件)。

如果您像我一样希望这些遗留导入“在”当前存储库中的提交之前,您将需要执行类似的操作git checkout --orphan newroot

#!/usr/bin/python

import os
import sys
import datetime as dt

LEGACY_PATH = '/path/to/legacy'
REPO_PATH = '/path/to/repo'
AUTHOR_NAME = 'Your Author <your@author.com>'

def main():
    os.chdir(REPO_PATH)
    #We assume you are on the branch where you want to import
    #Otherwise the following line will do
    #os.system('git checkout --orphan newroot')
    subdirs = sorted(os.listdir(LEGACY_PATH))
    print subdirs

    for d in subdirs:
        fullpath = os.path.join(LEGACY_PATH, d)
        legacy_date = dt.datetime.strptime(d, '%Y%m%d').isoformat()

        cmd = 'git --git-dir=%s/.git --work-tree=%s add .' \
                % (REPO_PATH, fullpath)
        print '\n', cmd
        os.system(cmd)

        os.chdir(REPO_PATH)
        cmd = 'git commit -m "Import changes from legacy version %s" \
                --date=%s \
                --author="%s"' \
                % (d, legacy_date, AUTHOR_NAME)
        print '\n', cmd
        os.system(cmd)

if __name__ == "__main__":
    main()
于 2013-08-07T17:22:09.143 回答
1

我没有明确测试过这个,但它应该可以工作。制作一个 git repo 的副本并针对它进行测试,这样如果出现问题,你就不会丢失任何重要的东西。

#!/bin/bash

LEGACY_PATH=/path/to/legacy/versions
REPO_PATH=/path/to/git/repo

cd ${REPO_PATH}
git checkout -b import-legacy
for V in $(ls -v ${LEGACY_PATH}/*); do
  cd ${V}
  git --git-dir=${REPO_PATH}/.git --work-tree=${REPO_PATH} add -A .
  git commit -m "Import changes from legacy version ${V}"
done
git rebase --interactive master
(reorder your changes, if needed, on top of the last legacy import)
git checkout master
于 2013-07-22T19:54:25.360 回答