如何将现有CVS模块导入现有git存储库的子目录中

Ult*_*urd 6 git cvs

我正在复制一个相当古老的代码项目,从我定期使用CVS开始,作为我已经在使用git工作的新项目中的一个组件.我仍然可以访问CVS存档旧项目的模块是的,所以我只是要使用git-cvsimport得到提交历史,并从那里走.但是,这只是在当前的一个内部创建一个新的git存储库.完全有可能我需要这样做一个多步骤的过程,我去CVS - >新的git存储库,然后使用其他东西将它带入现有的git存储库.

在newproj/newsubdir中运行它($ CVSROOT已在我的shell配置中正确设置):

git cvsimport -k -o master -u -s \- -A ~/Documents/cvs-authors.txt oldproj
Run Code Online (Sandbox Code Playgroud)

让我一个全新的存储库取名为NewProj/newsubdir/git的/所有正确提交的(注释,时间戳,历史),并与HEAD,我想它.

我想要的是历史CVS提交就好像它们总是在newproj/newsubdir/oldproj-file1,newproj/newsubdir/oldproj-file2等等.根据我的经验,git有做这种事情的魔力,但我找不到明显适合我的情况.

Ult*_*urd 0

根据这个结合 git 存储库的答案,找出了如何做我想做的事情,使用 git filter-branch 使其好像从 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
Run Code Online (Sandbox Code Playgroud)

假设 git 存储库中的目标子目录是全新的,或者至少不包含与 CVS 模块中的文件共享名称的文件,那么合并应该会顺利进行。

需要注意的是:我上面有 gsed,因为 OS X 附带的 BSD sed 不能像 \t 那样进行字符转义,而且我还没有费心给它起别名。