2009-12-01 31 views
6

我正在复活一个相当古老的代码项目,从我定期使用CVS时起,作为新项目中的一个组件,我已经致力于使用git。我仍然可以访问旧项目模块所在的CVS存档,因此我只是要使用git-cvsimport来获取提交历史并从那里开始。但是,这只是在当前的git仓库中创建一个新的git仓库。完全可能的是,我需要将其作为一个多步骤流程来执行,在这个过程中,我将转到CVS - >新鲜的git存储库,然后使用其他方法将其存入现有的git存储库。如何将现有的CVS模块导入到现有git存储库的子目录中

在取名为NewProj/newsubdir运行这个($ CVSROOT已经正确地在我的shell配置设置):

git cvsimport -k -o master -u -s \- -A ~/Documents/cvs-authors.txt oldproj 

让我一个全新的存储库取名为NewProj/newsubdir/git的/所有正确提交的(评论,时间戳,历史记录)和HEAD在我想要的地方。

我想要的是历史CVS承诺,就好像它们总是在newproj/newsubdir/oldproj-file1,newproj/newsubdir/oldproj-file2等等。以我的经验,git有这样做的魔力有些事情,但我找不到适合我的情况。

回答

0

想通了怎么办我基于this answer for combining git repositories想要什么,使用Git滤波器分支,使其仿佛从CVS导入的模块已被直接合并到现有的git仓库

从开始所需的子目录含取名为NewProj目录,现有的Git仓库:

% git cvsimport -k -u -s \- -A ~/Documents/cvs-authors.txt \ 
    -C newproj-sibling oldproj 
% cd newproj-sibling 
% git filter-branch --index-filter \ 
    'git ls-files -s | gsed "s-\t-&subdir/of/newproj/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
    git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 
% cd ../newproj 
% git pull ../newproj-sibling master 

假设在Git仓库的目标子目录是全新的,或者至少载有与CVS的模块共享名没有文件,合并应熄灭顺利。

一个警告:我上面已经说过了,因为OS X附带的BSD sed不能像\ t那样进行字符转义,而且我还没有打扰过别名。

2

您有三种选择。他们都从干净的cvsimport开始,所以继续做下去。

  1. 引用repo作为子模块。
  2. 将回购获取到现有的回购中,并执行子树合并以加入历史。
  3. 做一些类似于#3的事情,然后重新安装树,以按时间顺序交织整个历史中的提交。

头号意味着外部项目依赖于内部,但可能不适合你。

第二个在这个subtree merge howto解释。这对你来说可能已经足够了。


,如果你喜欢一个干净的线性的历史,你可以做#3缠起来为好。我在清理项目中做了something similar,并且还有大量的文档和工具。

基本的想法是将所有的变化分离成一个补丁历史记录,以重建这些变化。默认情况下,这个历史记录是以某种存储库顺序存储的,但是运行我在文章中提到的脚本将按照时间顺序将这些补丁重新排列成一个新的序列。

树散列应该让你知道你没有打破沿袭以外的任何东西。

如果我再次这样做,我可能会发射移植文件并执行filter-branch

+0

噢,你回答我是在回答自己。诅咒我的急躁! – UltraNurd 2009-12-02 04:39:39

相关问题