【发布时间】:2017-04-20 02:55:05
【问题描述】:
我想 git 提交一个 .sh 文件,但希望它在我在另一台服务器上签出同一个文件时可执行。
有没有办法在签出文件的服务器中不手动 chmod u+x 该文件?
【问题讨论】:
标签: git
我想 git 提交一个 .sh 文件,但希望它在我在另一台服务器上签出同一个文件时可执行。
有没有办法在签出文件的服务器中不手动 chmod u+x 该文件?
【问题讨论】:
标签: git
根据official documentation,您可以使用update-index 子命令设置或删除任何跟踪文件上的“可执行”标志。
要设置标志,请使用以下命令:
git update-index --chmod=+x path/to/file
要删除它,请使用:
git update-index --chmod=-x path/to/file
幕后
虽然这看起来像常规的 unix 文件权限系统,但实际上并非如此。 Git 为其内部存储中的每个文件维护一个特殊的“模式”:
100644 用于常规文件100755 用于可执行文件您可以使用ls-file 子命令和--stage 选项将其可视化:
$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0 .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0 my_executable_script.sh
默认情况下,当您将文件添加到存储库时,Git 将尝试尊重其文件系统属性并相应地设置正确的文件模式。您可以通过将core.fileMode 选项设置为 false 来禁用此功能:
git config core.fileMode false
疑难解答
如果在某些时候未设置 Git 文件模式但文件具有正确的文件系统标志,请尝试删除模式并重新设置:
git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file
奖金
从 Git 2.9 开始,您可以暂存文件并在一个命令中设置标志:
git add --chmod=+x path/to/file
【讨论】:
Antwane's answer 是正确的,这应该是一个注释,但是 cmets 没有足够的空间并且不允许格式化。 :-) 我只想在 Git 中补充一点,文件权限仅1 记录为644 或755(拼写为(100644 和@987654327 @; 100 部分表示“常规文件”):
diff --git a/path b/path
new file mode 100644
前者——644——意味着文件应该不是可执行的,而后者意味着它应该是可执行的。这在文件系统中如何变成实际的文件模式在某种程度上取决于操作系统。在类 Unix 系统上,这些位通过您的 umask 设置传递,通常是 022 以删除“组”和“其他”的写权限,或 002 仅删除“其他”的写权限.如果您特别关心隐私并希望从“组”和“其他”中删除读取、写入和执行权限,也可能是 077。
1Git 的极早期版本保存了组权限,因此某些存储库中包含模式为 664 的树条目。现代 Git 不会,但由于任何对象的任何部分都无法更改,因此这些旧权限位仍然存在于旧树对象中。
仅存储 0644 或 0755 的更改是在提交 e44794706eeb57f2 中进行的,这是在 Git v0.99 之前,日期为 2005 年 4 月 16 日。
【讨论】:
e44794706eeb57f2ee38ed1604821aa38b8ad9d2,即早于 Git 版本 0.99。
为存储库中的所有文件设置可执行标志:
git ls-files --stage |grep 100644 | cut -f2 | xargs -d '\n' git update-index --chmod=+x
要取消所有文件的可执行标志,请执行相反的操作
git ls-files --stage | grep 100755 | cut -f2 | xargs -d '\n' git update-index --chmod=-x
...并设置所有.sh-scripts 可执行文件,也许这是你的方式:
git ls-files --stage | grep ".sh$" | cut -f2 | xargs -d '\n' git update-index --chmod=+x
【讨论】:
在 linux 上,别忘了
set sudo chmod +x /path/to/file
在本地进行 git 更新,否则 git 将始终将索引恢复到本地机器上默认设置的 644 !
在 Windows Powershell 中,您可以使用
icacls .\path\to\file /grant Everyone:F
【讨论】:
icacls .\path\to\file /grant Everyone:F