git crlf、lf自動轉換引起的問題
??項目組最近加了一個新功能到代碼中,使用flyway記錄數據庫版本變更,,,該工具會記錄每次數據庫結構的修改並生成sql文件存在指定目錄上(當然必須用它來變更數據庫,外部的變更它是無法感知的),然後每次啟動時flyway會檢查使用的數據庫和當前項目代碼中的sql變更版本是否一致,一致正常啟動,不一致中如果是數據庫落後將會更新數據庫(這樣能夠保證代碼在任何地方運行數據庫都是一致的),否則就報錯了。數據庫中有一張表記錄版本信息,如下圖:
同時本地代碼中也有一個文件夾保存每次操作的sql語句,如下圖:
通過對比checksum值來判斷當前sql語句和生成數據庫的執行語句是否一致,checksum值由CRC32計算後處理得出。
??然後問題就來了,組中的其他人搭建好flyway後,項目文件生成了兩個sql文件,我用git拉下來後啟動報錯,checkupsum值對不上,,然後我又不懂這個flyway完全不知道咋回事,然後就根據報錯的位置一點點找到checkup值生成的代碼,發現是CRC32計算的,,(就這麽搞了一兩個小時才發現是文件不一致了),但是都是從git拉的怎麽就我不一致呢???想到可能是文件換行符的問題,遂把那幾個sql文件的文件換行符全換成了crlf(windows中的換行符),然後居然就能夠運行。。。關於為啥都從git拉取的文件換行符會不一樣原因是:他們都用的那個小烏龜的可視化,我用的命令行。可視化工具自動配置了文件換行符的自動轉換(這是git的一個智能功能,上傳時將文件換行符替換為lf,,拉取時再替換為crlf,,這樣保證中心倉庫使用UNIX風格的換行符,,本地能夠根據運行環境使用相對應的換行符風格),但是命令行並沒有配置。
??解決辦法也很簡單,開啟git 的自動轉換。
git config --global core.autocrlf true //開啟換行符自動轉換
git config --global core.safecrlf true //禁止混用換行符
git crlf、lf自動轉換引起的問題