Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux git将LF替换为CRLF_Linux_Windows_Git_Newline_Lf - Fatal编程技术网

Linux git将LF替换为CRLF

Linux git将LF替换为CRLF,linux,windows,git,newline,lf,Linux,Windows,Git,Newline,Lf,使用bash在windowsxp机器上运行git。我从SVN导出了我的项目,然后克隆了一个裸存储库 然后,我将导出粘贴到bare repositories目录中,并执行了以下操作: git add -A 然后我收到了一张信息列表,上面写着: LF将被CRLF替换 这种转变的后果是什么?这是Visual Studio中的.NET解决方案。我不太了解Windows上的git,但是 在我看来,git正在转换返回格式以匹配运行平台(Windows)的返回格式。CRLF是Windows中的默认返回格式,

使用bash在windowsxp机器上运行git。我从SVN导出了我的项目,然后克隆了一个裸存储库

然后,我将导出粘贴到bare repositories目录中,并执行了以下操作:

git add -A
然后我收到了一张信息列表,上面写着:

LF将被CRLF替换


这种转变的后果是什么?这是Visual Studio中的.NET解决方案。

我不太了解Windows上的git,但是

在我看来,git正在转换返回格式以匹配运行平台(Windows)的返回格式。CRLF是Windows中的默认返回格式,而LF是大多数其他操作系统的默认返回格式

当代码移动到另一个系统时,返回格式可能会得到适当调整。我还认为git足够聪明,可以保持二进制文件完好无损,而不是试图将LFs转换为CRLFs,比如JPEG格式

总之,您可能不需要为这种转换感到太多烦恼。然而,如果您将项目归档为tarball,其他程序员可能会喜欢使用LF行终止符而不是CRLF。根据您的关心程度(以及您是否使用记事本),您可能希望将git设置为使用LF返回(如果可以的话):)


附录:CR为ASCII码13,LF为ASCII码10。因此,CRLF是两个字节,而LF是一个。

Git有三种处理行尾的方式:

$ git config core.autocrlf
# that command will print "true" or "false" or "input"
您可以通过向上述命令行添加额外的参数
true
false
来设置要使用的模式

如果
core.autocrlf
被设置为true,这意味着每当您向git repo添加git认为是文本文件的文件时,它都会将所有CRLF行结尾变为LF,然后再将其存储在提交中。每当您
git checkout
something时,所有文本文件都会自动将其LF行结尾转换为CRLF结尾。这允许跨平台开发项目,这些平台使用不同的行尾样式,而不会产生很大的噪音,因为每个编辑器都会更改行尾样式,因为行尾样式始终是一致的

这种方便转换的副作用,这就是您看到的警告,是如果您最初编写的文本文件具有LF结尾而不是CRLF,它将像往常一样与LF一起存储,但稍后签出时将具有CRLF结尾。对于普通的文本文件,这通常很好。在本例中,该警告是“仅供参考”,但如果git错误地将二进制文件评估为文本文件,则它是一个重要的警告,因为git会损坏二进制文件

如果
core.autocrlf
设置为false,则不会执行行尾转换,因此文本文件会按原样检入。只要您的所有开发人员都在Linux或Windows上,这通常就可以正常工作。但根据我的经验,我仍然倾向于使用混合行结尾的文本文件,最终导致问题

作为一名Windows开发人员,我个人的偏好是保持该设置处于打开状态


有关包含“输入”值的更新信息,请参阅。

我也遇到了这个问题

SVN不进行任何行尾转换,因此提交文件时CRLF行尾保持不变。如果然后使用git svn将项目放入git中,那么CRLF结尾会一直保存到git存储库中,这不是git希望自己处于的状态—默认情况下,只签入unix/linux(LF)行结尾

然后在windows上签出文件时,autocrlf转换会使文件保持原样(因为它们在当前平台上已具有正确的结尾),但是,决定是否与签入文件存在差异的过程会在比较之前执行反向转换,导致将其认为是签出文件中的LF与存储库中意外的CRLF进行比较

据我所知,您的选择是:

  • 在不使用git svn的情况下,将代码重新导入到新的git存储库中,这意味着行尾将在最初的git commit-all中转换
  • 将autocrlf设置为false,忽略行尾不是git首选样式这一事实
  • 在关闭autocrlf的情况下签出文件,修复所有行尾,重新签入所有内容,然后再次打开
  • 重写存储库的历史记录,使原始提交不再包含git不期望的CRLF。(历史重写的常见警告适用)


  • 脚注:如果您选择选项2,那么我的经验是,一些辅助工具(重基、补丁等)无法处理CRLF文件,您迟早会遇到CRLF和LF混合的文件(行尾不一致)。在GNU/Linux shell提示符下,dos2unix和unix2dos命令允许您轻松地转换/格式化来自MS Windows的文件unix2dos和dos2unix都可以在带有gitbash的Windows中使用。可以使用以下命令执行UNIX(LF)->DOS(CRLF)转换。因此,您将不会得到警告

    unix2dos filename
    

    但是,不要在任何现有的CRLF文件上运行此命令,那么每隔一行就会得到空的换行符

    dos2unix-D文件名
    不适用于所有操作系统。请检查兼容性

    如果出于某种原因需要强制执行该命令,请使用
    --force
    。如果显示无效,则在vim中使用
    -f
    打开文件(例如:
    :e您的文件
    输入),然后


    从~/.gittributes文件中删除以下内容

    *text=auto

    将首先阻止git检查行结尾

  • 在记事本++中打开文件
  • 转到编辑/下线转换
  • 单击以选择Windows格式
  • 保存文件
  • 这些消息是到期的
    dos2unix -D filename
    
    :set noendofline binary
    :wq
    
    core.autocrlf=true:      core.autocrlf=input:     core.autocrlf=false:
                                                 
            repo                     repo                     repo
          ^      V                 ^      V                 ^      V
         /        \               /        \               /        \
    crlf->lf    lf->crlf     crlf->lf       \             /          \      
       /            \           /            \           /            \
    
    1) true:             x -> LF -> CRLF
    2) input:            x -> LF -> LF
    3) false:            x -> x -> x
    
    file to commit -> repository -> checked out file
    
    git config core.autocrlf false
    
    [core]
           autocrlf = input
           safecrlf = false
    
    echo "* -crlf" > .gitattributes 
    
    C:\Program Files (x86)\Git\etc>git config --global core.autocrlf false
    
    git config --global core.autocrlf input 
    
    git rm --cached -r . 
    
    git reset --hard
    
    # Set the default behavior, in case people don't have core.autocrlf set.
    * text=auto
    
    # Explicitly declare text files you want to always be normalized and converted
    # to native line endings on checkout.
    *.c text
    *.h text
    
    # Declare files that will always have CRLF line endings on checkout.
    *.sln text eol=crlf
    
    # Denote all files that are truly binary and should not be modified.
    *.png binary
    *.jpg binary
    
    * text=auto
    
    *.txt         text eol=lf
    *.xml         text eol=lf
    *.json        text eol=lf
    *.properties  text eol=lf
    *.conf        text eol=lf
    
    *.awk  text eol=lf
    *.sed  text eol=lf
    *.sh   text eol=lf
    
    *.png  binary
    *.jpg  binary
    
    *.p12  binary
    
     indent_style = space
     indent_size = 2
     end_of_line = lf    <<====
     charset = utf-8
    
    git config core.autocrlf false