如何做 git-svn fetch 并保留空目录?

How to do git-svn fetch and retain empty directory?

我创建了一个简单的脚本来迁移相当大的 SVN 存储库。我没有使用 git svn clone,而是使用 git svn initgit 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 的行为不会保留空目录。因此,我可能需要手动检查那些空目录(*我试图避免)。

git svn clone 中有一个 --preserve-empty-dirs 参数,但 git svn fetch 中没有。

是否有任何解决方法来解决这个问题?

更新

虽然官方文档中没有提到我们可以使用config key来fetch,但实际上是可以的

@Vampire对这个问题有详细的解释。所以我会简化这个。

完成初始化存储库后,我不得不更改远程分支的配置:

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 更适合这个用例。

有很多名为 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 设置为 truesvn-remote.<remote name>.placeholder-filename 设置为您在 initfetch 之间提供的参数。因此,只需在初始化之后和获取之前手动执行此操作就可以了。

请注意: preserve-empty-dirs 仅当您需要在 Git 存储库中拥有这些空目录并且您仅使用Git 之后的存储库。只要您只使用 git svn 作为现有 SVN 存储库的前端,emtpy 目录应该会自动在您的工作区中创建,并且不需要是实际存储库历史记录的一部分。 preserve-empty-dirs 所做的是向提交添加一个空的 .gitignore 文件(或您使用其他参数/​​配置 属性 配置的任何内容),这样该文件夹就不再是空的了。这样做是因为 Git 是内容跟踪器,而不是文件系统跟踪器。它跟踪恰好存储在文件中的源代码,而不是文件和文件夹本身。这也是为什么在 Git 中没有显式 movecopy 操作这样的东西的原因,因为移动和复制是在必要和需要的地方即时确定的。从技术上讲,它只是 removeadd for move 或简单的 add for copy.