GIT - 關於文件處理

大家平時在使用GIT的時候,尤其是在Windows平臺的時候,一般都不會特別留意跟文件相關的一些問題,比如說 文件權限,大小寫問題。

這篇文章將給大家介紹在GIT使用中,關於文件處理的兩個問題

文件權限

正常情況下,我們都不用太在乎,甚至不用理會GIT裏面文件的權限是否可讀,可寫,可執行。但如果我們加進GIT的文件是一個可執行的文件,比如一個方便快捷部署的文件deploy.sh. 那麼如果沒有可執行權限的話,在Linux系統下面是無法執行的。

當我們新建一個deploy.sh文件,加到GIT裏面,我們通過git ls-files -s可以看到文件是權限是644

D:\workspace\blog\demo (master -> origin)
λ git ls-files -s
100644 d37be9ba5c2dc1491460e7ce7d0bfdc1c4de6613 0       deploy.sh

這樣的話,我們在Linux就不能直接執行這個deploy.sh的文件(當然我們可以在Linux強制修改文件的權限,但會導致後續的代碼更新出錯). 這時我們可以用git update-index --chmod=+x YOUR_FILE的命令,來修改文件的權限

D:\workspace\blog\demo (master -> origin)
λ git update-index --chmod=+x deploy.sh

D:\workspace\blog\demo (master -> origin)
λ git ls-files -s
100755 d37be9ba5c2dc1491460e7ce7d0bfdc1c4de6613 0       deploy.sh

D:\workspace\blog\demo (master -> origin)

這時大家就可以提交代碼了,Linux環境下就可以執行這個deploy.sh文件了

Windows系統下文件名大小寫重命名

如果大家的開發環境時Windows,而實際部署的環境時Linux的話,就有可能會遇到這個問題:

你一開始給某個文件夾起名爲 demofolder,裏面有個文件httpUtil.js提供get的方法。 過幾天大家一起codereview的時候,這個名字被大家吐槽要用駝峯,所以你回來之後就想着給這個名字重命名爲demoFolder, 中間的==F==變大寫。 於是你就在Windows的目錄中,把文件夾名字改名爲demoFolder, 然後就準備提交代碼。 結果發現git status沒有任何代碼變更,commit不了!

這是怎麼回事呢?

這是因爲GIT默認忽略大小寫,git config core.ignorecase 這個值默認爲true

D:\workspace\blog\gitdou (master -> origin) ([email protected])
λ git config core.ignorecase
true

我們可以簡單地通過git config core.ignorecase false命令把忽略大小寫關掉。但是二牛不建議這樣做,尤其是在Windows環境下,容易遇到合併分支時由於大小寫問題而出現衝突。 建議採用重命名的方式來實現改名。

GIT有個mv的命令來實現文件的重命名. 比如把demofolder改成demoFolder1, 我們可以用git mv demoFolder demoFolder1來實現。但是不能只是改爲大小寫

D:\workspace\build_your_own_x\gitdou (master -> origin) ([email protected])
λ git mv demoFolder demofolder
Rename from 'demoFolder' to 'demofolder/demoFolder' failed. Should I try again? (y/n) n

原因前面已經說了,GIT默認是忽略大小寫的。所以我們可以來個曲線救國,先rename成其它名字,再改回來就可以了

D:\workspace\build_your_own_x\gitdou (master -> origin) ([email protected])
λ dir
 Volume in drive D is DATA
 Volume Serial Number is 086F-F062

 Directory of D:\workspace\build_your_own_x\gitdou

01/10/2019  05:34 PM    <DIR>          .
01/10/2019  05:34 PM    <DIR>          ..
06/28/2018  04:41 PM                66 .gitattributes
07/18/2018  08:20 AM               935 .gitignore
01/10/2019  03:25 PM    <DIR>          demofolder
06/28/2018  04:41 PM             1,070 LICENSE
06/29/2018  09:19 AM    <DIR>          node_modules
06/29/2018  10:04 AM               561 package.json
06/28/2018  04:57 PM               102 README.md
01/10/2019  03:29 PM    <DIR>          src
06/29/2018  10:03 AM    <DIR>          test
               5 File(s)          2,734 bytes
               6 Dir(s)  12,081,958,912 bytes free

D:\workspace\build_your_own_x\gitdou (master -> origin) ([email protected])
λ git mv demofolder demoFolder1

D:\workspace\build_your_own_x\gitdou (master -> origin) ([email protected])
λ git mv demoFolder1 demoFolder

D:\workspace\build_your_own_x\gitdou (master -> origin) ([email protected])
λ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    demofolder/httpUtil.js -> demoFolder/httpUtil.js

以上就是關於GIT文件操作的兩個問題以及對應的解決方案,希望能在你需要的時候提供一點思路!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章