使用reposurgeon将SVN存储库转换为git而不创建.gitignore文件?

时间:2014-04-02 20:12:14

标签: git svn reposurgeon

我使用reposurgeon将我的svn转换为git存储库:(How do I convert an svn repo to git using reposurgeon?)。

问题是,转换的标签在我创建标签时的日志中显示,而不是在它们所属的修订位置。在SVN中,无论我多久创建它们,它们都会显示在它们所属的日志中的正确位置。

似乎这必须做一些事情,reposurgeon在每个标签中添加.gitignore的提交,如下所示:

# A simulation of Subversion default ignores, generated by reposurgeon.
*.o
*.lo
...
*.pyo
*.rej
*~
.#*
.*.swp
.DS_store
# The contents of the svn:ignoreproperty on the branch root.
*~
nbproject
*.project

如何让reposurgeon不在所有标签中为gitignore创建这样的提交?并让它创建简单的标签,这些标签不会作为提交出现在时间轴中吗?

reposurgeon manual sais:

  

用户生成的.gitignore

     

此消息表示reposurgeon已在其正在分析的Subversion存储库中找到.gitignore文件。这可能发生了   因为有人使用git-svn作为实时网关,并创建了   忽略哪些可能与生成的那些一致或不一致   Subversion忽略属性的.gitignore文件   翻译成。您需要就哪一组做出政策决定   忽略在转换中使用,并可能删除   生成.gitignore文件或用户创建的文件。

但没有例子如何做出这个决定。我该如何管理?

4 个答案:

答案 0 :(得分:2)

  

您需要就哪一组忽略做出政策决定   用于转换,并可能删除生成的   .gitignore文件或用户创建的文件。

转换前你有.gitignore吗?如果是这样,那就与之后的那个相比较。看起来这个政策决定与你的提交顺序是分开的。问题,对吗?基本上,政策问题只是"得到你喜欢的最终.gitignore"。做到达到那里需要的东西。

在git中,.gitignore文件的管理方式与任何其他文件完全相同。所以你可以说git log .gitignore并查看提交内容的贡献。假设整个.gitignore文件在一个块10提交之前提交,你希望它分开。如果是这样,您可以执行git rebase --interactive HEAD~11修改相关提交。对于要分解的每一行,请git add --partial .gitignore; git commit。然后git rebase --continue得出结论。

如果你希望每个新的逐项提交都是他们对应的更大代码提交的一部分,那么你会再次使用他们的合作伙伴提交来重新定位-i以及压缩它们。如果这听起来像不必要的工作,它可能是。如果可以,我建议你专注于回购最终状态的完整性而不是完美的历史表达。

注意:我不明白您使用术语"标记"在这种情况下,由于SVN和git都有"标签",但你似乎没有提到任何一种。也许"忽略线"或"条目"会更清楚。

清除版本控制中的历史记录是有问题的。在所有分支上更改历史记录有效地创建了一个新的存储库,因为任何(每个人都必须重新定义)的下游关注者不再具有连续性。但是如果你想这样做,对于每个分支,找到文件系统中的所有.gitignores,看看提交的内容是什么:

  git log `find . -name .gitignore`

然后,您可以执行上述 rebase --interactive 步骤来更改这些提交。如果提交仅影响 <。em> .gitignore,则可以将其删除。但很明显,如果提交涉及100个文件,包括.gitignore,你必须将好处与坏处分开。

或者,如果您知道所有.gitignore文件的路径(签出每个分支并从上面运行查找),那么您可以使用执行github has documented之类的操作滤波器分支

git filter-branch --force --index-filter      \
 'git rm --cached --ignore-unmatch .gitignore path/to/other/.gitignore'  \
 --prune-empty --tag-name-filter cat -- --all

他们还提到了一个BFG java工具,但filter-branch应该做你需要的。

答案 1 :(得分:2)

在您的subversionrepository中读取后,只需添加:

expunge /gitignore/

这将删除reposurgeon自动添加的所有.gitignore文件。

答案 2 :(得分:0)

我从未使用过reposurgeon,但我已经使用内置的git svn ...命令将许多svn存储库转换为git。我按照http://trac.parrot.org/parrot/wiki/git-svn-tutorialhttp://john.albin.net/git/convert-subversion-to-git上的指示符进行了跟踪。

答案 3 :(得分:0)

@robrich

此处为回购协议的作者。不要使用git-svn进行转换!这是一个灾区。查看此PSA:

http://esr.ibiblio.org/?p=6778