1. 程式人生 > >小熊糖否——木子兮的自留地

小熊糖否——木子兮的自留地

不同的作業系統有不同的換行符格式,跨平臺協作時需要考慮版本工具(git)對換行符的處理<!--more-->

回車和換行

回車(Carriage Return)和換行(Line Feed)概念:

  • 回車CR:將游標移動到當前行開頭;
  • 換行LF:將游標“垂直”移動到下一行,並不改變游標水平位置。

以上的概念只適用於打字機,現代計算機沿用的時候主要使用的是回到行首換行+回到行首的功能。看下面的例子:

1、在Windows下應用程式輸出\n到檔案,會被自動轉換成\r\n

// output:
// first line
// second line
printf("first line\nsecond line"
); // test.txt output; // first line\r\nsecond line std::fstream fout("test.txt", std::ios::out); if (fout.is_open()) { fout.write("first line\nsecond line", sizeof("first line\nsecond line")); fout.close(); }

2、在windows下應用程式輸出\r到檔案,不會被轉換,並且並不會起到“將游標移動到當前行開頭”的作用

// output:
// second line
printf("first line\rsecond line"
); // test.txt output; // first line\rsecond line std::fstream fout("test.txt", std::ios::out); if (fout.is_open()) { fout.write("first line\rsecond line", sizeof("first line\rsecond line")); fout.close(); }

3、在Windows下應用程式輸出\r\n到檔案,\r\n會被自動轉換成\r\r\n

// output:
// first line
// second line
printf("first line\r\nsecond line"
); // test.txt output; // first line\r\r\nsecond line std::fstream fout("test.txt", std::ios::out); if (fout.is_open()) { fout.write("first line\r\nsecond line", sizeof("first line\r\nsecond line")); fout.close(); }

不同系統下的換行符

CR、LF、CR/LF為不同作業系統上使用的換行符:

  • Windows/DOS系統:採用CR/LF表示下一行;
  • Unix/Linux系統:採用LF表示下一行;
  • Mac OS系統:採用CR表示下一行;
  • Mac OS X系統:採用LF表示下一行(Mac OS X已經改成和Unix/Linx一樣使用LF)。

CR使用符號'\r',十進位制ASCII程式碼是13,十六進位制程式碼為0x0D;LF使用'\n'符號表示,ASCII程式碼是10,十六製為0x0A。所以Windows平臺上換行在文字檔案中是使用 0d 0a 兩個位元組表示,而UNIX和蘋果平臺上換行則是使用 0a 或 0d 一個位元組表示。

Unix/Linux/Mac系統下的檔案在Windows裡開啟的話(使用Windows自帶記事本),會出現換行丟失,所有文字會變成一行,整個文字會亂成一團。Windows系統下的檔案在Unix/Linux/Mac裡開啟的話,在每行的結尾可能會多出一個^M符號。

目前大部分的編輯器和IDE都支援這幾種換行符(除了notepad),但是跨平臺協作專案原始碼到底儲存為哪種風格的換行符呢?輸出的文字需要儲存為哪種風格的換行符呢?Git提供了一個解決方案——在跨平臺協作場景時,會提供一個“換行符自動轉換”的功能。

Git CRLF

Git預設在提交時將Windows換行符(CRLF)轉換為LF,在拉取時將UNIX換行符(LF)替換成CRLF。我們可以通過設定autocrlf和safecrlf來設定具體的操作。

autocrlf and saftcrlf

1、autocrlf

// 提交時轉換為LF,檢出時轉換為CRLF
git config --global core.autocrlf true   

// 提交時轉換為LF,檢出時不轉換
git config --global core.autocrlf input   

// 提交檢出均不轉換
git config --global core.autocrlf false

2、safecrlf

// 拒絕提交包含混合換行符的檔案
git config --global core.safecrlf true   

// 允許提交包含混合換行符的檔案
git config --global core.safecrlf false   

// 提交包含混合換行符的檔案時給出警告
git config --global core.safecrlf warn

.gitattributes

.gitattributes檔案能夠設定每個倉庫的換行符配置,摘取Link中的設定為例:

###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto

###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following 
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln       merge=binary
#*.vcxproj   merge=binary

###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg   binary
#*.png   binary
#*.gif   binary

###############################################################################
# diff behavior for common document formats
# 
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the 
# entries below.
###############################################################################
#*.doc   diff=astextplain
#*.DOC   diff=astextplain
#*.docx  diff=astextplain
#*.DOCX  diff=astextplain
#*.dot   diff=astextplain
#*.DOT   diff=astextplain
#*.pdf   diff=astextplain
#*.PDF   diff=astextplain
#*.rtf   diff=astextplain
#*.RTF   diff=astextplain

1、text=auto:採用git認為最好的方式來處理檔案,未在.gitattributes中設定的項預設按照這種方式處理;

2、text eol=crlf/lf:在checkout時,轉換Line Ending為crlf/lf;

3、binary: 告訴git該檔案為二進位制,防止git修改該檔案。

注意:.gitattributes檔案必須要提交之後才能生效。

由於目前Jenkins推送到打包伺服器上的程式碼預設採用LF結尾,所以建議倉庫內建立.gitattributes檔案並設定。

專案實施一

設定原則

本地倉庫完全一致,適合單一平臺程式設計

團隊設定

一個團隊需要使用同一的換行符標準(UNIX標準或者Windows標準),然後配置自己的程式碼編輯器和IDE,達到兩項要求:

  • 在新建檔案時預設使用團隊統一的換行符標準;
  • 在開啟檔案時保持現有換行符格式不變(不要做自動轉換)。

Git設定

1、關閉換行符自動轉換功能

// 提交檢出均不轉換
git config --global core.autocrlf false

2、開啟換行符檢查功能(按照需求設定)

// 拒絕提交包含混合換行符的檔案
git config --global core.safecrlf true   

// 允許提交包含混合換行符的檔案
git config --global core.safecrlf false   

// 提交包含混合換行符的檔案時給出警告
git config --global core.safecrlf warn

留意每次提交

如果提交的時候變更行數過多(超過自己修改),或者增減行數相同,很有可能是整個檔案的換行符被修改了,這個時候就要注意檢查了。

專案實施二

設定原則

保證倉庫永遠換行符永遠採用UNIX標準(LF),在Windows工作空間設定為Windows標準(CRLF),在Mac/Linux工作空間設定為Unxi標準(LF),適合跨平臺程式設計

團隊設定

統一不同平臺下的換行符標準,按照上面設定原則的標準,配置自己的程式碼編輯器和IDE,,達到兩項要求:

  • 在新建檔案時預設使用團隊統一的換行符標準;
  • 在開啟檔案時保持現有換行符格式不變(不要做自動轉換)。

Git設定

1、設定換行符自動轉換功能

# Configure Git on OS X or Linux to properly handle line endings
git config --global core.autocrlf input

# Configure Git on Windows to properly handle line endings
git config --global core.autocrlf true

2、設定換行符檢查功能

// 提交包含混合換行符的檔案時給出警告
git config --global core.safecrlf warn

留意每次提交

1、留意每次提交的更改行數。

2、留意提交時的換行符警告。


相關推薦

——自留地

不同的作業系統有不同的換行符格式,跨平臺協作時需要考慮版本工具(git)對換行符的處理<!--more--> 回車和換行 回車(Carriage Return)和換行(Line Feed)概念: 回車CR:將游標移動到當前行開頭;換行LF:將游

【拼多多】

連結:https://www.nowcoder.com/questionTerminal/dc49df3bbc0146dd92322889d40afcb1 來源:牛客網   [程式設計題]小熊吃糖 熱度指數:838 時間限制:1秒 空間限制:32768K 演算法知識

南陽acm62

ins 並且 class == IT include mpi href strlen 笨小熊 時間限制:2000 ms | 內存限制:65535 KB 難度:2 描述 笨小熊的詞匯量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用

nyoj 62-笨(以對應數組中的ASC位 + 1)

ora 選擇 else max 代碼 OS title 數組 插入 62-笨小熊 內存限制:64MB 時間限制:2000ms Special Judge: No

兩隻隊高階軟體工程第七次作業敏捷衝刺3

團隊的作業:學生資訊管理系統 隊員學號:     周菲(隊長) 201810812007     孔繁燕    201810812001 Alpha敏捷衝刺: 1、 站立式會議照片: 2、每個人的工作: 周菲: 今天已完成:1、完成登陸介面響應窗體,登陸成功即出現主窗體

兩隻隊高階軟體工程第七次作業敏捷衝刺7

團隊的作業:學生資訊管理系統 隊員學號:     周菲(隊長) 201810812007     孔繁燕    201810812001 Alpha敏捷衝刺: 1、 站立式會議照片: 2、每個人的工作: 周菲: 今天已完成:實現修改班級資訊功能 遇到的問題:修改後的班

網羅java筆試題(一)

1.問:Java提供哪幾種運算子? 答:算術運算子、關係運算符、位運算子、邏輯運算子、賦值運算子、其他運算子。 答案相關連結 2.問:從下列選項選出java.lang包中的方法,用來比較兩個物件是否相等,相等返回true。 A.toString() B.equals() C.compare

高階軟體工程第八次作業:“兩隻隊”團隊作業-5

團隊作業:學生資訊管理系統 成員:周菲(隊長)201810812007           孔繁燕           201810812001 1.Alpha版本測試報告   測試過程中發現

“兩隻隊”Alpha版本展示部落格

團隊成員簡介: 周菲(隊長):熟練掌握java和C語言,熟悉java資料庫連線、JDBC和java桌面應用的開發,團隊合作能力較強,責任心較強,做事認真細緻,為人熱情開朗。                  

兩隻隊高階軟體工程第九次作業敏捷衝刺1

團隊的作業:學生資訊管理系統 隊員學號:     周菲(隊長) 201810812007     孔繁燕    201810812001 Alpha敏捷衝刺: 1、 站立式會議照片:   2、每個人的工作: 周菲: 今天已完成: 開會討論了專案需要增加的幾個小功

怎麼重灌電腦系統,一鍵重灌電腦系統教程

給電腦重灌系統現在已經是一件很平常的事了,電腦有什麼問題都是重啟開機,如果重啟電腦還是沒辦法解決的話,那就來一次系統重灌,除了電腦硬體出現問題以外,基本上電腦出現問題都可以通過重灌電腦系統解決。那要怎麼給電腦重灌系統呢? 一開始我們都是通過光碟來重灌系統的,但是一方面因為光

兩隻隊高階軟體工程第九次作業敏捷衝刺3

團隊的作業:學生資訊管理系統 隊員學號:     周菲(隊長) 201810812007     孔繁燕    201810812001 Alpha敏捷衝刺: 1、 站立式會議照片:   2、每個人的工作: 周菲: 今天已完成:使用者非法資訊錄入輸入提示框功能測

兩隻隊高階軟體工程第九次作業敏捷衝刺4

團隊的作業:學生資訊管理系統 隊員學號:     周菲(隊長) 201810812007     孔繁燕    201810812001 Alpha敏捷衝刺: 1、 站立式會議照片:   2、每個人的工作: 周菲: 今天已完成: 系統架構優化 遇到的問題:

兩隻隊高階軟體工程第九次作業敏捷衝刺5

團隊的作業:學生資訊管理系統 隊員學號:     周菲(隊長) 201810812007     孔繁燕    201810812001 Alpha敏捷衝刺: 1、 站立式會議照片:   2、每個人的工作: 周菲: 今天已完成: 學生資訊管理介面和成績管理介面增

兩隻隊高階軟體工程第九次作業敏捷衝刺6

團隊的作業:學生資訊管理系統 隊員學號:     周菲(隊長) 201810812007     孔繁燕    201810812001 1、 站立式會議照片:   2、每個人的工作: 周菲: 今天已完成: 設定所有視窗介面為單介面模式 遇到的問題: 暫無 明

兩隻隊高階軟體工程第九次作業敏捷衝刺7

團隊的作業:學生資訊管理系統 隊員學號:     周菲(隊長) 201810812007     孔繁燕    201810812001 1、 站立式會議照片:   2、每個人的工作: 周菲: 今天已完成: 介面優化,增加了一些小圖示 明日計劃: SQLyog表

線上一鍵重灌系統教程

電腦使用久了,因為資料越來越多導致越來越卡,這個時候重灌系統就可以解決電腦的卡頓問題了。不過不少人還不是很懂如何重灌系統,那麼接下來小編以重灌win7系統為例,教大家使用小熊一鍵重灌系統,線上一鍵重灌系統。 第一步:開啟小熊一鍵重灌系統,會為我們進行環境檢測,然後點選下一步

網羅資料庫筆試題(一)

1.問:刪除表資料,同時保留表結構,()方法比()方法效率高 A.delete B.drop table C.truncate table D.delete all 答:C,A 解析: truncate table 命令將快速刪除資料表中的所有記錄,但保留

Problem Q 與糖果

樣例資料 輸入 10 3 2 4 2 1 1 1 2 1 3 9 3 9 11 9 12 9 1000 8 11 輸出 Bob Limak Limak Bob Bob Limak Limak Bob Bob Bob 樣例解釋 在第一組資料中,Limak 先吃一顆糖,然

java網路程式設計五:暴力法破解登入系統的完全實現()

注:以下破解思路及程式碼源自我同學木子 1、先來看一個無任何安全措施的登入系統的破解方法:每次模擬表單提交,若登入成功,此時返回的報頭資訊中有Location欄位,登入失敗無此欄位,繼續模擬登入。直到破解成功,本人成功破解部分同學校園網登入密碼(純四位數字的)程式碼如下