如何在Windows上的Git中创建文件执行模式权限?

我在Windows中使用Git,并希望通过一次提交将可执行shell脚本推入Git repo。

通常我需要做两个步骤(git commit)。

$ vi install.sh
$ git add install.sh
$ git commit -am "add new file for installation" # first commit
[master f2e92da] add support for install.sh
1 files changed, 18 insertions(+), 3 deletions(-)
create mode 100644 install.sh
$ git update-index --chmod=+x install.sh
$ git commit -am "update file permission"        # second commit
[master 317ba0c] update file permission
0 files changed
mode change 100644 => 100755 install.sh

我如何将这两个步骤合并为一个步骤?git配置?windows命令吗?

参考:关于第二次提交,请参阅Windows上Git文件的权限中的问题

337479 次浏览

不需要两次提交,你可以添加文件并在一次提交中标记它可执行:

C:\Temp\TestRepo>touch foo.sh


C:\Temp\TestRepo>git add foo.sh


C:\Temp\TestRepo>git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

正如您所注意到的,在添加后,模式是0644(即,不可执行)。但是,我们可以在提交之前将其标记为可执行:

C:\Temp\TestRepo>git update-index --chmod=+x foo.sh


C:\Temp\TestRepo>git ls-files --stage
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

现在文件的模式是0755(可执行)。

C:\Temp\TestRepo>git commit -m"Executable!"
[master (root-commit) 1f7a57a] Executable!
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100755 foo.sh

现在我们有一个单独的提交和一个可执行文件。

事实上,如果git-add--mode标志就好了

git 2.9.x/2.10(2016年第三季度)实际上允许这样做(感谢爱德华•汤姆森):

git add --chmod=+x -- afile
git commit -m"Executable!"

这使得整个过程更快,即使core.filemode设置为false也能工作。

参见提交4 e55ed3(2016年5月31日),作者爱德华·汤姆森(ethomson) 得益于:# EYZ1。< br > (由滨野朱尼奥——gitster——提交c8b080a合并,2016年7月6日)

add:添加--chmod=+x / --chmod=-x选项

可执行位将不会被检测到(因此不会被检测到) 对于core.filemode设置为false的存储库中的路径, 尽管用户可能仍然希望将文件添加为可执行文件 与拥有core.filemode的其他用户的兼容性 功能。< br > 例如,Windows用户添加shell脚本时,可能希望将它们作为可执行文件添加,以便与非Windows用户兼容

虽然这可以通过管道命令(git update-index --add --chmod=+x foo)来完成,但git-add命令允许用户使用他们已经熟悉的命令设置文件可执行文件

如果文件已经设置了+x标志,git update-index --chmod=+x什么都不做,git认为没有什么要提交的,即使标志没有保存到repo中。

你必须首先删除标志,运行git命令,然后把标志放回去:

chmod -x <file>
git update-index --chmod=+x <file>
chmod +x <file>

然后 git看到一个更改,并允许您提交更改。


提交者所需的git配置(来源:先知的回答):

git config core.filemode false

克隆程序所需的git配置:

git config --global core.autocrlf input

注意,首先你必须确定在config git文件中filemode设置为false,或者使用以下命令:

git config core.filemode false

然后你可以用这个命令设置0777权限:

git update-index --chmod=+x foo.sh
我的cmd.exe中没有touchchmod命令 和git update-index --chmod=+x foo.sh不适合我

我最终通过设置skip-worktree位来解决它:

git update-index --skip-worktree --chmod=+x foo.sh

我必须做的是让它为我工作:

  1. 使用GitHub Desktop来提交,它不会识别更改,因此不会提交
  2. 相反,在终端中,我运行git add --chmod=+x foo.sh
  3. 然后# EYZ0