之前写过一篇博客“探索TFS Git 库文件换行(CRLF)的处理方式”,主要是针对TFVC代码库的。

下面这篇文章说明如何在TFS的Git库中处理代码换行的问题。

概述

在Azure DevOps Server(之前叫TFS) 中使用Git管理源代码,需要特别注意代码文件的换行处理。我们在许多团队碰到这样现象,开发人员在自己的Windows 中使用Eclipse 或者Visual Studio 编写和调试代码,功能都正常。但是,使用TFS 的自动生成和发布功能,将源代码下载到Linux 或 AIX等非Windows 的服务器上做编译和其他操作的时候,发现所有的功能都乱套的,甚至连基本的编译都无法成功。排查原因后发现,导致系统异常的原因是文件换行的格式。

我们在编写代码的时候,每次敲击一次回车键,代码会从下一行开始。实际上,我们在代码行的最后面插入了一个不可见的字符,这个字符叫做换行符(line ending)。在历史上,不同的操作系统处理换行符的方式不一样,例如Windows 使用crlf,Linux 使用lf,而早期的mac使用cr,后来有改为lf了。更加详细的内容,可以参考我上一篇博客“探索TFS Git 库文件换行(CRLF)的处理方式”。

在TFS 的Git库中,服务器和客户端对于文件换行符也有自己的处理方式。由于不同的开发人员使用不同的工具和操作系统,例如你使用Windows开发调试,而你的同事使用Mac编写代码,而TFS代理服务器则使用Linux 编译打包。如果不能统一处理换行标准,必然会导致许多未知的问题。例如我们在项目实施过程中,经常碰到这样的问题:“上一次的持续集成成功了,我们没有修改代码,怎么这次就出问题了,怎么这次就失败?”分析原因,TFS服务器在两次持续集成流程中使用了不同的代理服务器,而不同代理服务器上Git客户端处理换行的方式不一样。

解决不同开发人员、不同编译环境处理Git中的源代码换行的问题,我们可以使用下面两个统一的方案:统一开发环境中的Git配置,统一代码库的设置。

解决方案

1. 统一开发环境中的Git配置

在开发人员的计算机上配置Git客户端的全局变量(core.autocrlf),可以强制用户使用指定的方式处理行尾标识符,例如:

$ git config --global core.autocrlf true

# 按照Windows的方式处理换行符

$ git config --global core.autocrlf input

# 按照Linux的方式处理换行符

2. 统一代码库的设置

按照上面的方式处理文件,可以在一台开发计算机上使用统一的标准处理的源代码。但是,在实际开发过程中,需要按照不同的Git库做不同的处理。例如,对于存储.net程序的代码库,我们希望使用Windows的方式来处理换行符;对于java和shell脚本,我们希望使用Linux的方式处理换行符。

Git为我们提供了一种机制,可以针对每个库,设置不同的处理方式。在Git中,有一个特殊的文件.gitattributes。这个文件配置了Git客户端处理代码时候的各种设置(https://git-scm.com/docs/gitattributes) 。我们在每个git库中添加这个文件,再根据自己的需要,修改文件中的设置,就可以实现对不同库不同处理方式。.gitattributes中的设置会覆盖用户在上一章节中的配置。从此以后,无论你的开发人员工作在哪个平台上,只要他下载已经配置.gitattributes文件的代码库,就会按照我们指定的方式处理换行符。

.gitattributes必须放置在代码库的根目录下。保存的方式与我们提交、推送的方式完全一样。你可以把它视为一个普通的代码文件。

.gitattributes文件中的内容有点类型一个两行的表格:

  • 左边的内容表示Git库中的文件名称或者文件路径
  • 右边的内容表示对代码文件换行符的处理方式

下面是一个简单的示例:

# 使用默认的方式,开发人员客户端如何,git就如何处理换行符

* text=auto

# 明确指定使用原文件中的换行符

*.c text

*.h text

# 指定扩展名为sln的文件名称,使用Windows的换行符

*.sln text eol=crlf

# 指定扩展名为png或jpg的为二进制文件,不需要处理做任何修改

*.png binary

*.jpg binary

从上面的配置,你可以看到,在配置.gitattributes文件时,我们可以使用通配符,例如*.c, *.sln, *.png等。还可以使用空格,在一行中同时指定多种文件。下面,来看一下各种处理文件的配置方式:

  • text=auto: Git将按照自己的方式处理文件,一般是按照我们在上一节中配置的方式处理换行符。
  • text eol=crlf:在代码克隆、签出时,Git总是将换行符转换为crlf,就是我们Windows常用的格式。即使在Linux或者Mac操作系统中,Git也会按照这种方式处理。
  • text eol=lf:在代码克隆、签出时,Git总是将换行符转换为lf,就是我们Linux常用的格式。即使在Windows操作系统中,Git也会按照这种方式处理。
  • binary:Git会认为这种文件不是纯文本文件,它对这些文件不做任何处理。

3. 后续处理

按照上面的方式配置了你环境或者Git库后,你会发现实际上本地的文件没有任何变化。原来是Windows换行的,照样还是Windows。但是,实际上Git已经迫切希望按照你设定的方式来文件了。

可以参考下面的方式更新你的本地文件,同时还不会丢失目前的工作成果:

1)立即保存目前的所有文件

git add . –u

git commit –m “在刷新文件换行符之前,保存所有更改”

2)删除Git索引,并且强制Git从小扫描工作目录

rm .git/index

3)重写Git的索引文件,并应用最新的换行设置

git reset

4)查看Git状态

git status

5)将所有修改过的文件添加到提交清单中

git add -u

6)添加.gitattributes文件

git add .gitattributes

7)提交和推送文件

git commit –m “统一文件换行符”

git push

微软DevOps MVP 张洪君 http://www.cnblogs.com/danzhang

--End--

Azure DevOps Server (TFS)中代码文件换行问题解决方案(Git)的更多相关文章

  1. 在Azure DevOps Server (TFS)中实现VUE项目的自动打包

    概述 Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.由于它在数据绑定.页面展示和使用简单方面有很大的优势,逐渐被越来越多的前端开发团队使用.本文 ...

  2. 还原Azure DevOps Server (TFS)中误删除的生成流水线

    流水线历史记录 DevOps Server流水线的历史记录有完善的版本日志,用户可以随时回退到修改过程中的任何一个版本,还能比较差异.这个历史记录功能可以和代码库中的版本控制媲美. 图一:生成历史记录 ...

  3. Azure DevOps Server (TFS) 代码库Repo管理培训

    Repo是分布式代码库Git中的一个专用词,用于存储和管理开发团队中特定的源代码. 使用Git,可以协调整个团队的代码更改. 即使您只是一个开发人员,版本控制也可以帮助您在修复错误和开发新功能时保持井 ...

  4. 在Azure DevOps Server (TFS)的流水线中编译和测试Xcode移动应用(iPhone)

    概述 Xcode是开发基于苹果macOS系统的桌面应用和移动应用的主要IDE工具.使用Azure DevOps Server (原名TFS)系统中的pipelines流水线功能,可以方便的集成Xcod ...

  5. 集成Azure DevOps Server(TFS) 与微软Teams

    1.概述 Microsoft Teams是Office 365中团队协作的中心.将团队的所有聊天.会议.文件和应用程序放在一个位置.软件开发团队可以在一个专门的协作中心中即时访问他们所需的所有内容,T ...

  6. 在Azure DevOps Server (TFS 2019) 流水线传递参数

    变量概述 在Azure DevOps Server的流水线中,变量是衔接不同任务和不通代理之间的桥梁,它可以使相对松散.各自独立的任务之间相关影响并共享数据.在流水线中使用变量,可以在各任务之间相互调 ...

  7. 在Windows操作系统的文件管理器中集成Azure DevOps Server (TFS)工具菜单

    故事场景 使用过SVN的用户,都知道在Windows的文件夹上点击鼠标右键,就会弹出Tortoise SVN的操作菜单(俗称小乌龟).通过这个功能,用户不需要打开SVN工具,可以直接在Windows的 ...

  8. Azure DevOps Server (TFS) 修改工作项附件大小限制

    1. 问题描述 当上传工作项附件时,系统提示"附件大小限制" 2.解决方案 2.1 默认设置 默认情况下,Azure DevOps Service和Team Foundation ...

  9. Azure DevOps Server (TFS) 修改Git文件大小限制

    签入Git的所有文件将永远保留在存储库中,限制大文件签入到代码库,可以增加磁盘使用效率,提高系统备份还原等日常维护的效率. 通过下面的设置,团队项目管理员可以阻止超过特定大小的文件进入存储库.如果推送 ...

随机推荐

  1. 检查mysql是否运行

    netstat -tunple|grep mysql

  2. javase高级技术 - 反射

    在说反射之前,必须得先说说java的类加载器,类加载器的定义:将.class文件加载到内在中,并为之生成对应的Class对象. 一般有三种 1 Bootstrap ClassLoader 根类加载器也 ...

  3. java 中jar的使用

    ????????????这里不会 需要学习

  4. 【NIFI】 Apache NiFI 与 SQL 操作

    本里需要基础知识:[NIFI] Apache NiFI 安装及简单的使用 查询SQL 1.拖入一个 Processor:ExecuteSQLRecord(执行sql记录) 2.配置,SETTINGS的 ...

  5. xml约束的概念

    1 xml 约束的概念 XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML ...

  6. raiDrive添加坚果云

    把坚果云网盘映射到本地. 使用raidrive 中webDAV添加坚果云. 1.登录自己的坚果云网页版,点“安全选项”,右侧有第三方应用管理,生成密码,按照示例填入第三方应用即可. 2.注意:暂时此处 ...

  7. Python图表绘制:matplotlib绘图库入门(转)

    matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...

  8. 通俗理解 CPU && GPU

    CPU 力气大啥P事都能干,还要协调.GPU 上面那家伙的小弟,老大让他处理图形,这方面处理简单,但是量大,老大虽然能处理,可是老大只有那么几个兄弟,所以不如交给小弟处理了,小弟兄弟多,有数百至数千个 ...

  9. 高效能程序员的七个习惯【csdn】

    从网上看到的,感觉挺不错的! Beautiful is better than ugly. Explicit is better than implicit. Simple is better tha ...

  10. Ubuntu 16.04 安装 postgresql 9.3

    1.Ctrl+Alt+t 打开终端 2.输入:wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo a ...