执行 git add 时是否自动 chmod 一个文件?

执行 git add 时是否自动 chmod 一个文件?

我有一个使用 git 来管理文件的 ubuntu 开发系统,但我喜欢在不同(windows)系统上的 QTCreator 中进行编辑,因此我有一个映射到 ubuntu 服务器的 windows 网络驱动器。

但是,似乎每当我保存文件时,它都会在 Windows 上添加执行标志。有时它会从 664 更改为 764,有时我看到它会更改为 777。

因此我在执行 git add 之前一直执行 chmod 644,但是这很麻烦,有时我会忘记。

是否有一个好的方法可以防止 windows/QT 添加 +x,或者只是让“git add”在暂存/提交之前自动 chmod 664 我的 .c 和 .h 文件?

谢谢

答案1

编辑:

一种解决方案可能是将core.fileMode变量设置为false~/.gitconfig这会使 git 忽略可执行位。

如果您使用的是 FAT 文件系统,您可能也想进行设置core.ignorecasetrue

旧答案

假设你在 Linux 机器上提交,那么你可以使用钩子,在这种情况下.git/hooks/pre-commit

#!/bin/sh
find . -type f -not -perm 0644 -exec chmod 644 {} \+
find . -type d -not -perm 0755 -exec chmod 755 {} \+
git add .

这有点粗暴,因为它强制所有文件和目录具有特定的权限。chmod如果特定文件需要在find和之间具有其他权限,您可能需要为其添加命令git add。另一方面,它很短小简单。

更复杂的解决方案可能用于git diff --cached --name-only检查哪些文件实际上将被提交,并且仅修复这些文件。但这会更复杂,并且无法修复随机权限更改。

#!/bin/sh
FILES=$(git diff --cached --name-only)
chmod 644 $FILES

答案2

如果您需要修复现有 repo 中的文件(例如可执行位),请尝试以下操作:

git ls-files “*.sh” | xargs git update-index –add –chmod=+x
git ls-files “*.exe” | xargs git update-index –add –chmod=+x

git ls-files 比“find”更快

相关内容