我创建了一个简单的脚本来迁移相当大的SVN存储库。我没有使用git svn clone
,而是使用git svn init
和git svn fetch
,以便我可以指定修订版并按块获取块。或多或少,它是这样的:
while [ "$CURRENT_REVISION" -lt "$MAX_REVISION" ]; do
END_REVISION=$((CURRENT_REVISION + 100))
if [ "$END_REVISION" -ge "$MAX_REVISION" ]
then
END_REVISION=$MAX_REVISION
fi
git svn fetch -r "$CURRENT_REVISION":"$END_REVISION" --authors-file="$AUTHORS_FILE"
#increasing the current and end revision
CURRENT_REVISION=$END_REVISION
END_REVISION=$((CURRENT_REVISION + 100))
done
但是,据我所知,默认情况下,fetch / clone的行为不会保留空目录。因此,我可能需要手动签入那些空目录(*我试图避免)。
--preserve-empty-dirs
中有一个git svn clone
参数,但git svn fetch
中没有。
是否有任何解决方法可以解决这个问题?
更新
即使在官方文档中没有提到我们可以使用配置键进行获取,它实际上是有效的
@Vampire有关此问题的详细解释。所以我会简化这个。
执行init存储库后,我不得不更改远程分支的配置:
git config svn-remote.<remote name>.preserve-empty-dirs "true"
git config svn-remote.<remote name>.placeholder-filename ".gitkeep"
您可以通过查看/.git/config来验证配置。只需进行正常的提取,您的目录就会被保留。
答案 0 :(得分:2)
git-svn
不是用于一次性转换存储库的正确工具。如果您想将Git用作现有SVN服务器的前端,这是一个很棒的工具,但对于一次性转换,您应该不使用git-svn
,但svn2git
是更适合这种用例。
有一些称为svn2git
的简单工具,最好的工具是来自https://github.com/svn-all-fast-export/svn2git的KDE工具。我强烈建议您使用svn2git
工具。这是我所知道的最好的,它可以非常灵活地使用它的规则文件。
如果您不是100%关于存储库的历史记录,那么http://blog.hartwork.org/?p=763中的svneverever
是一个很好的工具,用于在将SVN存储库迁移到Git时调查其历史记录。
如果您仍想使用git svn
,则无需通过手工方式强行取出。只需执行git svn clone ...
,如果要暂停,取消执行,然后执行git svn fetch
继续提取过程。它将自动在它停止工作的地方继续,甚至验证最后提取的修订版是关于它是完全取出还是需要重新获取。
如果您仍想手动填充提取内容,请注意git svn clone ...
与git svn init ...
完全相同,后跟git svn fetch
,但根据clone
除外特定参数配置属性svn-remote.<remote name>.preserve-empty-dirs
设置为true
,svn-remote.<remote name>.placeholder-filename
设置为init
和fetch
之间的参数。所以,只需在初始化之后和提取之前手动执行此操作即可。
但需要注意的是: preserve-empty-dirs
afair仅在您需要在Git存储库中拥有这些空目录并且之后只使用Git存储库时才需要。只要您只使用git svn
作为现有SVN存储库的前端,就应该在工作区中自动创建emtpy dirs,而不必将其作为实际存储库历史记录的一部分。 preserve-empty-dirs
的作用是将空.gitignore
文件(或您使用其他参数/ config属性配置的任何内容)添加到提交中,以便该文件夹基本上不再为空。这样做是因为Git是内容跟踪器,而不是文件系统跟踪器。它跟踪恰好存储在文件中的源代码,而不是文件和文件夹本身。这也是Git中没有明确的move
或copy
操作的原因,因为移动和副本是在必要和需要时动态确定的。从技术上讲,remove
只有add
和move
,add
只有copy
。