3

我在这里使用 reposurgeon 将我的 svn 转换为 git 存储库:(如何使用 reposurgeon 将 svn repo 转换为 git?)。

问题是,转换后的标签显示在我创建标签时的日志中,而不是它们所属的修订版的位置。在 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手册说:

用户生成的 .gitignore

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

但是没有示例如何做出该决定。我该如何管理?

4

4 回答 4

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步骤来更改这些提交。如果提交影响.gitignore,您可以将其删除。但很明显,如果提交涉及 100 个文件,包括 .gitignore,则必须将好与坏分开。

或者,如果您知道所有 .gitignore 文件的路径(检查每个分支并从上面运行查找),那么您可以执行github使用filter-branch记录的类似操作:

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 应该可以满足您的需要。

于 2014-06-11T22:33:04.637 回答
2

阅读您的 subversionrepository 后,只需添加:

expunge /gitignore/

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

于 2014-08-15T21:25:21.907 回答
0

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

于 2014-06-15T00:59:04.867 回答
0

@robrich

reposurgeon 的作者在这里。不要使用 git-svn 进行转换!这是一个灾区。请参阅此 PSA:

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

于 2018-07-13T16:39:06.263 回答