git svn 克隆导致空目录

46

我有一个svn仓库,其项目结构如下:

/root/projectA/trunk
/root/projectA/branches
/root/projectA/tags

/root/projectB/trunk
/root/projectB/branches
/root/projectB/tags 

我想克隆项目A。当我运行以下命令时:

git svn clone -r <revision number>:HEAD <url>/root/projectA

我没有收到任何错误,并在新项目A目录下创建了一个git仓库。 但是该目录为空。 我错过了什么吗?


请参见https://dev59.com/6U_Sa4cB1Zd3GeqP_EdB。 - rogerdpack
8个回答

68

我遇到的问题是使用了-s--stdlayout参数,因为我的svn仓库没有标准布局(trunk、branches、tags)。


4
我也一样。我有一个单一的代码库,里面有许多项目,并且每个项目都有主干、标签和分支 -- 但这并不是标准布局。 - Dave

29

下面的命令完成了任务:

  git svn clone -r HEAD <url>/root/projectA 

15

对于任何人,包括使用authors-file选项的人,在执行git svn clone命令时,如果遇到没有在提供的作者文件中找到匹配值的作者,将会完全停止。如果您没有关注,Git 的此“警报”可能看起来像仓库已经完成克隆,并且没有说明该过程未完成。 除了 .git 目录之外,该仓库目录将为空。

如果添加缺失的作者,然后重新运行确切的命令,Git 将会在中断处继续执行。


1
你如何找出缺失的作者? - LovesTha
4
@LovesTha,缺失的作者将会在屏幕上显示。 - Robin
这正是我的问题,非常令人困惑。我有一个“大部分”标准的布局,但也有一些随机的根目录 - 我以为这或许是问题所在,或者旧版本的Subversion是问题所在,但实际上问题出在缺少作者信息上。我故意删除了一些我不想重写的作者,认为这是可选的,并没有意识到屏幕上最后一个警告实际上是致命错误。谢谢! - aaron

2

我曾经遇到过同样的问题,使用--no-metadata参数解决了。在你的情况下,这将等同于:

git svn clone -r <revision number>:HEAD <url>/root/projectA --no-metadata

2
在使用此选项之前,请查看以下链接中关于不使用元数据的优缺点 - http://git-scm.com/docs/git-svn。 - boddhisattva

1
如果您使用HTTP或HTTPS传输协议(即您的仓库URL以HTTP[s]开头),则需要提供有效的SVN用户名。
git svn clone -s https://svn.example.com/root/projectA --username <SVN username>

-s是--stdlayout的别名

然而,我只需要在第一次指定--username选项,后续调用就不需要了。我猜测它会缓存用户名。


1
在我的情况下,克隆操作未能正确完成。 git svn clone 在检出的过程中会失败。一旦我解决了这个问题,在克隆操作之后它自动执行了检出操作 - 不再有空文件夹。
[更新] 以下是在我的情况下有效的方法: 尝试使用 git svn clone --preserve-empty-dirs <repo> 对我来说失败了。在搜索网络后,我发现 https://www.semitwist.com/articles/article/view/the-better-svn-git-guide,其中部分内容如下:
这部分有点烦人。从v1.7.7开始,Git有一个--preserve-empty-dirs选项。问题是,该选项坏了。如果你尝试按原样使用它,整个操作很可能会在中途失败。必须修复它。
首先,找到你的git-svn文件: $ find / 2> /dev/null | grep git-svn $ find 2>/dev/null / -type f | grep -l "Failed to strip"
对我来说,它位于/usr/libexec/git-core/git-svn。
注意:它不再在git-svn中(至少在git 2.7.0中不再存在)。我在/usr/lib/perl5/vendor_perl/5.22/Git/SVN/Fetcher.pm中找到它。
用你喜欢的编辑器打开目标文件:
sudo path/to/file 现在,在这个git-svn文件中,搜索die "Failed to strip path。([根据你的git版本]它可能在4583行附近)。将die更改为print并保存。您的git-svn现在已修复。 git svn clone --preserve-empty-dirs <repo>现在应该按预期运行。

什么问题? - DDiVita
抱歉,@DDivita。我不确定为什么我没有在回复中放置我找到的解决方案。已更新。 - U007D

1

我曾经遇到过类似的问题,在该目录中执行“git reset --hard HEAD”命令似乎可以创建文件。

由于“.git/objects”文件夹非常大,我猜这些文件是从svn导入到git中的,但它们并没有被检出或其他一些原因。


0

我无法检查这是否有效,但请尝试:

git svn clone --stdlayout <url>/root/projectA/

2
没有任何区别,最终仍然会得到一个空目录! - tom eustace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接