alf*_*thz 5 svn git github git-svn
我创建了一个简单的脚本来迁移相当大的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
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,默认情况下,fetch/clone的行为不会保留空目录.因此,我可能需要手动签入那些空目录(*我试图避免).
有一个--preserve-empty-dirs参数,git svn clone但没有git svn fetch.
是否有任何解决方法可以解决这个问题?
UPDATE
即使在官方文档中没有提到我们可以使用配置键进行获取,它实际上是有效的
@Vampire有关于这个问题的详细解释.所以我会简化这个.
在执行init存储库之后,我不得不更改远程分支的配置:
git config svn-remote.<remote name>.preserve-empty-dirs "true"
git config svn-remote.<remote name>.placeholder-filename ".gitkeep"
您可以通过查看/.git/config来验证配置.只需执行普通提取,您的目录就会被保留.
git-svn不是用于一次性转换存储库的正确工具。如果您想使用 Git 作为现有 SVN 服务器的前端,那么它是一个很棒的工具,但对于一次性转换,您不应该使用,git-svn但svn2git它更适合此用例。
有很多名为 的工具,最好的可能是来自https://github.com/svn-all-fast-export/svn2gitsvn2git的 KDE 工具。我强烈建议使用该工具。这是我所知道的最好的,并且它的规则文件非常灵活。svn2git
如果您不是 100% 了解存储库的历史记录,svnevereverhttp ://blog.hartwork.org/?p =763 是一个很好的工具,可以在将 SVN 存储库迁移到 Git 时调查其历史记录。
如果您仍然想使用git svn,则无需手动进行抓取。只需执行git svn clone ...,如果您想暂停,请取消执行,然后执行git svn fetch继续获取过程。它将自动从停止工作的地方继续,甚至验证最后获取的修订是否已完全获取或需要重新获取。
如果您仍然想手动抓取数据,请注意 与后面的git svn clone ...完全相同,但根据特定参数,配置属性设置为并设置为您在和 之间提供的参数。因此,只需在 init 之后和 fetch 之前手动执行此操作即可。git svn init ...git svn fetchclonesvn-remote.<remote name>.preserve-empty-dirstruesvn-remote.<remote name>.placeholder-filenameinitfetch
但需要注意的是: preserve-empty-dirs只有当您需要在 Git 存储库中拥有这些空目录并且之后您才使用 Git 存储库时,才需要 afair 。只要您仅用作git svn现有 SVN 存储库的前端,则应该在您的工作区中自动创建空目录,并且不需要成为实际存储库历史记录的一部分。作用preserve-empty-dirs是将一个空.gitignore文件(或使用其他参数/配置属性配置的任何文件)添加到提交中,以便该文件夹基本上不再是空的。这样做是因为 Git 是一个内容跟踪器,而不是文件系统跟踪器。它跟踪恰好存储在文件中的源代码,而不是文件和文件夹本身。这也是为什么 Git 中不存在显式moveorcopy操作之类的原因,因为移动和复制是在必要和需要时动态确定的。从技术上讲,它只是一个removeand addformove或一个简单的addfor copy。