怎么做git-svn获取并保留空目录?

时间:2016-07-12 03:12:32

标签: git svn github git-svn

我创建了一个简单的脚本来迁移相当大的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的行为不会保留空目录。因此,我可能需要手动签入那些空目录(*我试图避免)。

--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来验证配置。只需进行正常的提取,您的目录就会被保留。

1 个答案:

答案 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设置为truesvn-remote.<remote name>.placeholder-filename设置为initfetch之间的参数。所以,只需在初始化之后和提取之前手动执行此操作即可。

但需要注意的是: preserve-empty-dirs afair仅在您需要在Git存储库中拥有这些空目录并且之后只使用Git存储库时才需要。只要您只使用git svn作为现有SVN存储库的前端,就应该在工作区中自动创建emtpy dirs,而不必将其作为实际存储库历史记录的一部分。 preserve-empty-dirs的作用是将空.gitignore文件(或您使用其他参数/​​ config属性配置的任何内容)添加到提交中,以便该文件夹基本上不再为空。这样做是因为Git是内容跟踪器,而不是文件系统跟踪器。它跟踪恰好存储在文件中的源代码,而不是文件和文件夹本身。这也是Git中没有明确的movecopy操作的原因,因为移动和副本是在必要和需要时动态确定的。从技术上讲,remove只有addmoveadd只有copy