git-svn可以像本地subversion客户端一样处理CRLF吗?

10

我有一个托管在Linux上的Subversion仓库,但只通过Windows客户端访问,因为它是一个大型Windows应用程序的源代码。

如果我能使用git-svn(由msysgit提供)来工作就太棒了。

我正在尝试让仓库不会在Windows风格的换行符上出现问题,但是遇到了很大的困难。

在使用svn clone将git仓库检出后:

  • core.autocrlf = true 显示对实际在仓库中使用LF的文件进行的修改。
  • core.autocrlf = input 显示对实际在仓库中使用LF的文件进行的修改。
  • core.autocrlf = false 显示对所有文件进行的修改。

在这里最好选择哪个选项?我应该使用core.autocrlf = true并提交对受影响文件的LFCRLF更改吗?

我几乎要放弃了,只是把我的Subversion工作副本放入git仓库。这将是一个不好的解决方案,但至少可以允许本地分支和暂存。当添加到Subversion时,显然会变得非常麻烦。

编辑:对于那些感兴趣的人。如果你使用Windows,那么git-svn会让你抓狂。下面hasen j的答案可能是正确的,但我不能按照他的建议去做,因为这样会招致我们团队中其他开发人员的愤怒。

我基本上放弃了这个问题,因为它不会带来合理的结果。希望下一个Google Summer of Code能吸引到想要接手他们的"Proper git-svn support on Windows"项目的人。请参见http://git.or.cz/gitwiki/SoC2009Ideas#Propergit-svnsupportonWindows


我真的很困惑。我开始尝试修复这个问题,但是在Windows上svn克隆的速度太慢了,所以我开始在Linux上进行操作。我将repo带到了Windows上,然后禁用了CRLF并执行了reset --hard。现在,我似乎有一个正常运行的git-svn存储库...现在要弄清楚实际需要哪些步骤才能使其始终正常工作...希望这确实有效,并且在我开始使用它时不会遇到问题。 - toholio
6个回答

6

做自己一个忙,不要动行尾,保持原样。将autocrlf设置为false

任何在Windows上半靠谱的文本编辑器都应该能够处理Unix风格的行尾。

core.autocrlf = false 显示对所有内容的修改。

我认为,如果你事后才这么做,它对你没有好处。

你必须删除这个仓库,将 autocrlf 设置为 false,然后再进行克隆操作。


可悲的是,半靠谱的编辑器并没有包含构建项目所需的全部编辑器。这很愚蠢,但暂时无法改变。在克隆之前,我尝试使用不同的设置,包括在Linux机器上进行克隆实验。然而,即使是这样,我仍然无法让git或构建工具处于一个状态,使得只有行结尾发生变化而不会标记过多更改。虽然这似乎适用于大多数人,但我会给你点赞的。 - toholio
在这种情况下,将所有行结尾转换为CRLF,并提交到主svn存储库。 - hasen
显然,那是不被允许的。叹气。 - toholio
这确实是一个有效的解决方案,用于在git-svn中处理存储文件带有CRLF(在Windows开发环境下)的svn仓库。 - Asturio

1

我曾经遇到过类似的问题。 解决方法是,在进行 git-svn 克隆之后,我对所有文件应用了 unix2dos 命令,因为在我的情况下,SVN 仓库中的所有文件都使用 CRLF。所以,我想你应该在 git-svn 之后手动尝试进行 CRLF-LF 转换。


目前看来,这似乎是我最好的选择。我可以使用“git status”的输出来列出已修改的文件,并将其通过脚本进行“修复”。设置“core.fileMode = false”和“git reset --hard”是必要的,才能使事情回到真正应该有的状态。虽然有点笨拙,但它似乎起到了作用。 - toholio
实际上,这仍然会影响git的差异。我回到了最初不太起眼的计划,将我的工作副本放入git存储库中。 - toholio

1

我通常使用git-filter-branchrecode dos..ascii -f来清理我的git-svn克隆。这也有助于进行latin1..utf8转换。


但是这难道不会破坏git的注释历史记录吗?我有类似于OP的问题,我相信,在克隆之后手动“修复”文件只意味着我正在覆盖那些文件的历史记录,使其毫无用处。 - Enno

1

由于我的其他答案不适用于您,这里有另一种处理情况的方法:

同时在同一个工作目录中使用svn和git。

主要使用git进行工作,从上游存储库拉取,进行本地更改、本地分支等;就像您在本地git项目上工作时通常所做的一切。

然后,当您想提交到中央svn存储库时,请使用svn客户端。

我有一些这方面的经验,只是我不会执行svn commit,而是使用svn diff创建补丁并提交它(因为我没有提交访问权限)。


这是一个相当聪明的想法。我会尝试一下。 - toholio
1
最终,我使用了完全本地的git存储库,并使用SVN更新(到git主分支)和提交到远程存储库。这样做,我没有得到非常有用的本地历史记录,但我确实获得了功能分支和其他git优点。希望将来我会有时间尝试修复git-svn实际存在的问题。 - toholio

0

我认为这并不能解决git-svn的问题。里面有一些愚蠢的东西,使得在Windows上获取可用的检出变得很麻烦。 - toholio

0
通常情况下,您会想要这样设置core.autocrlf选项:
git config core.autocrlf true

但根据这篇文章所说,它似乎与git-svn不兼容。在SVN仓库的安全备份中尝试一下可能是值得的。


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