我如何避免git-svn和svn CRLF问题,例如这个问题?

9
我正在使用git svn,今天遇到了一些问题。
我使用了git svn clone并花了一些时间在我的项目上。几天后,我把我的工作推到svn远程(git svn dcommit)。然后我尝试用TortoiseSVN检出项目,并查看一切是否正常。不幸的是,所有东西都被转换为Unix行结束符,并且VC6无法打开该项目。
所以,我的git工作副本是CRLF,但我的svn工作副本是LF。我假设git在git commitgit svn dcommit期间进行了转换。
如果我设置core.autocrlf = false,这会强制git保留新行吗?我是否正确地认为,如果我为我的git工作副本设置core.autocrlf = false,就可以避免所有这些麻烦?还有其他需要做的事情,使git svn易于使用,而不会给我的同事带来问题吗?
(也可能有趣的是,我之前在同一台机器上使用git svn,没有更改设置,这是发生类似问题的第一次。)
1个回答

1

Subversion有单独文件的EOLs转换设置的可能性。实际上,Git也有这个功能,以.gitattributes文件的形式('text'和'eol'属性)。

对于一般情况,core.autocrlf是不够的。

如果将其设置为false,则所有带有svn:eol-style=native的文件在git-svn工作副本中都将具有LF行结尾,这对于Windows来说是不符合预期的。

如果将其设置为true,则所有行结尾都将转换为LF,并以LF的形式发送到SVN(始终如此)。

实际上,svn:eol-style=unset应该对应于'-text' git属性(表示无转换),svn:eol-style=LF --- 对应于'eol=lf'属性,svn:eol-style=CRLF --- 对应于'eol=crlf'属性;svn:eol-style=native是系统相关的,因此可以通过未版本化的eol设置进行控制,因此相应的git属性是'!eol'(这意味着从.git/config的core.eol获取EOL设置)。

不必使用git-svn,您可以使用任何解决方案,自动将svn:eol-style转换为相应的.gitattributes值,并反之亦然。

其中一种解决方案是服务器端:您可以在SVN存储库中安装SubGit,并且只需使用SubGit创建的纯Git界面即可:

$ subgit install path/to/svn/repository
# Git interface with correct .gtattributes repository will appear at path/to/svn/repository/.git
# you should setup an access to it

然后在客户端上克隆它,并将core.eol设置为“crlf”以适用于Windows系统,而对于其他操作系统则设置为“lf”(默认值为“lf”)。

$ git clone <URL> working_tree
$ cd working_tree
$ git config core.eol crlf #for Windows only

之后,Git将以与SVN相同的方式运行。

另外,在客户端上,您可以使用SmartGit:您可以使用它克隆SVN存储库(而不是打开现有的git-svn存储库)---然后它将把svn:eol-style转换为.gitattributes。对于这种情况,不需要额外的core.eol设置,SmartGit会处理它。


5
我对这个答案有点困惑...这些信息都非常有用,但我认为你可能误解了问题。我不能在SVN上触摸任何东西,也不能让别人使用svn:eol-style,我的想法是没有人应该知道我在使用git。所以我需要改变的任何设置都应该在git方面。这有助于澄清问题吗?顺便说一下,我用git svn克隆的仓库当时是空的,所有内容都来自于第一次dcommit之后的git。 - dr Hannibal Lecter

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