能否让git-svn处理svn:eol-style?

18
许多svn仓库需要新文件具有svn:eol-style属性。是否有办法确保在git-svn中发生这种情况?
3个回答

12
你可以尝试在Subversion配置中设置自动属性([1][2])。这将确保在添加新文件时,svn:eol-style被正确设置。

据我所知,git-svn只是在内部使用svn,并且它应该加载subversion配置并为新文件设置自动属性。

好的,我测试过了,它可以工作。

示例.subversion/config:

[miscellany]
enable-auto-props = yes

[auto-props]
*.cpp = svn:keywords=Id Revision;svn:eol-style=native
*.cs = svn:keywords=Id Revision;svn:eol-style=native

1
但要小心:根据我的经验,git-svn将在提交时设置svn:eol-style=native属性,就像您描述的那样,但实际上不会在提交之前将提交的文件转换为LF行结尾。因此,任何CRLF行结尾都将完整地提交到子版本库中,但是子版本控制器希望所有具有svn:eol-style=native属性的文件都以LF行结尾存储。最终结果是,第一次有人从子版本工作副本编辑和提交这样的文件时,差异将包括CRLF到LF的转换。 - ntc2

8

@silk的上面的答案只是部分解决方案。完整的解决方案还包括配置git在提交时将CRLF转换为LF。因此,除了@silk建议的内容外,您还应该执行以下操作:

git config --global core.autocrlf input
git config --global core.safecrlf warn

或者:

git config --global core.safecrlf warn
git config --global core.attributesfile ~/.gitattributes
echo '* text=auto' >> ~/.gitattributes

说明:

根据我的经验,git-svn会在提交时设置svn:eol-style=native属性,如@silk所描述的那样,但实际上不会在提交之前将提交的文件转换为LF行结束符。因此,任何CRLF行结束符都将完整地提交到子版本库中,但是子版本控制器希望所有具有svn:eol-style=native属性的文件都以LF行结束符存储。最终结果是,第一次有人从子版本工作副本编辑和提交这样的文件时,差异将包括CRLF到LF的转换。

因此,完整的解决方案应包括强制git在提交之前将文件转换为LF行结束符。您可以通过设置core.autocrlf=input来实现这一点,这意味着“在提交时将所有CRLF转换为LF,但不要在检出时进行反向转换”,以及core.safecrlf=warncore.safecrlf=true,这将在您尝试提交具有CRLF行结束符的文件时发出警告或阻止您。 autocrlf设置将确保这些CRLFs得到转换,因此safecrlf=true可能过度了。请参阅git help config

或者,您可以使用git属性来强制转换,通过在所有文件上设置text=auto。要在全局范围内执行此操作,您需要在core.attributesfile中指定一个属性文件。请参阅git help attributes


还有一件事:使用这些配置,提交的文件将保留在 git-svn 工作副本中的任何 CRLF 行尾,直到您再次检出它们。如果您在 *nix 上并且想要 LF 行尾,则可以通过切换到不包含 CRLF 文件的分支,然后再切换回来来强制重新检出。或者,您可以使用 dos2unix 转换行尾,然后 git add 文件;不需要 git commit,因为预期是 LF 行尾。 - ntc2

2
考虑使用SubGit
从最初的构建开始,它支持适当的Subversion属性到.gitattributes/.gitignore转换(反之亦然)。其中包括svn:eol-style和“eol”,svn:mime-type和“text”,svn:ignore和.gitignore转换等其他内容。
SubGit是一种服务器端解决方案 - 必须将其安装到Subversion存储库中。之后,可以使用任何Subversion或Git客户端将更改发送到此存储库。请参阅SubGit文档以获取更多详细信息。总体而言,使用它非常容易:
  1. Generate SubGit configuration file:

    $ subgit configure svn_repos
    
  2. Adjust svn_repos/conf/subgit.conf file as needed to specify Git repository location, branches & tags layout, etc.

  3. Finish the installation:

    $ subgit install svn_repos
    
此时,SubGit将从您的Subversion存储库转换所有修订版本到Git存储库。然后,它安装其自定义挂钩以通过传入修改触发。这样,SubGit会在每次svn提交时连续转换Subversion修订版,并在每次git push时进行Git提交。
SubGit是一个商业项目,但对于小团队、开源和学术项目是免费的。我是SubGit开发人员之一。

这是一个完全合理的回答,但请披露您与SubGit项目的关联,http://stackoverflow.com/help/behavior - Dave Bacher

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