乐趣区

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) (gitdou@0.1.0)
λ 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) (gitdou@0.1.0)
λ 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) (gitdou@0.1.0)
λ 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) (gitdou@0.1.0)
λ git mv demofolder demoFolder1

D:\workspace\build_your_own_x\gitdou (master -> origin) (gitdou@0.1.0)
λ git mv demoFolder1 demoFolder

D:\workspace\build_your_own_x\gitdou (master -> origin) (gitdou@0.1.0)
λ 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 文件操作的两个问题以及对应的解决方案,希望能在你需要的时候提供一点思路!

退出移动版