自动将"git update-index --chmod = + x"应用于可执行文件

Byr*_*ins 55 git executable file-permissions

我经常将bash脚本添加到我的git存储库中,并且脚本在之前的linux文件系统中具有可执行权限git add.但是,在将添加的文件推送到远程存储库并拉入另一个位置之后,这些文件将显示为具有非可执行权限.似乎有两种方法可以解决问题:

1. chmod u+x $script 
   git commit -am "fixing the script permissions... again..."
Run Code Online (Sandbox Code Playgroud)

要么

2. git update-index --chmod=+x $script
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以让git简单地查看脚本上的文件权限git add,并认识到"嘿,这是一个可执行文件!" 并直接使用exectuable权限将其添加到存储库?

Von*_*onC 26

git 2.9.X/2.10(2016年第3季度)带来chmodgit add自己!

请参阅Edward Thomson()提交的4e55ed3(2016年5月31日). 帮助:Johannes Schindelin().(由Junio C Hamano合并- -提交c8b080a,2016年7月6日)ethomson
dscho
gitster

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

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

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

您可以在" 如何在Windows上的Git中创建文件执行模式权限? "(2011年2月)中查看此新功能的来源.


小智 15

有几种方法可以做到这一点.

  1. Git别名
  2. Bash别名
  3. 或者甚至结合使用bash和git别名
  1. Git别名

    你总是可以在你的git别名中使用bash.

    • 打开你的git配置:

      vim ~/.gitconfig

    • 向其添加别名部分(如果不存在):

      [alias]
          addscr = !sh -c 'if [[ ${0: -3} == ".sh" ]]; then git update-index --chmod=+x $0; git add $0'
      
      Run Code Online (Sandbox Code Playgroud)
  2. Bash别名

    • 编辑您的bash配置文件:

      vim ~/.bashrc

    • 在文件末尾添加:

      function gitadd(){
          if [[ ${1: -3} == ".sh" ]]
              then git update-index --chmod=+x $1
          fi
          git add $1
       }
       alias gitadd='gitadd'
      
      Run Code Online (Sandbox Code Playgroud)
  3. 结合git和bash别名

    • 编辑您的bash配置文件:

      vim ~/.bashrc

    • 将其添加到文件末尾:

      function checkShellFile(){
          return ${1: -3} == ".sh"
      }
      alias gitadd='checkShellFile ? git addsrcipt "$1" : && git add "$1"'
      
      Run Code Online (Sandbox Code Playgroud)
    • 编辑你的git配置文件:

      vim ~/.gitconfig

    • 向其添加别名部分(如果不存在):

      [alias]
          addscript = !sh -c 'git update-index --chmod=+x $0 && git add $0'
      
      Run Code Online (Sandbox Code Playgroud)

以上都没有经过测试


l0p*_*pan 7

这是一个自动将"git update-index --chmod + x"应用于可执行文件的脚本:

for f in `find . -name '*.sh' -o -regex './s?bin/[^/]+' -o -regex './usr/sbin/[^/]+' -o -regex './usr/lib/[^/]+' `;do
 ( cd `dirname $f` && git update-index --chmod=+x  `basename $f` )
done 
Run Code Online (Sandbox Code Playgroud)


A. *_*lai 7

没有花哨的 bash 脚本的解决方案

  1. fileMode = true在您的.git/config文件中设置(或git config core.filemode true按照其他人指出的方式运行)
  2. 更改文件权限的可执行位并提交此更改。(chmod u+x $script正如你所指出的)。您只需执行此操作一次。
  3. 推到遥控器

下次从那里拉取时,git 将在文件上设置提交的可执行位。我也有类似的问题,这解决了他们。

fileMode = true告诉 git 跟踪它唯一能做的关于权限的事情:可执行位。这意味着对可执行位的更改将被 git 识别为工作树中的更改,并且这些更改将在您下次提交时存储在 repo 中。

一旦您提交了所需的可执行位,您还可以将其重置fileMode为,false以便下次当您不想提交这些更改时,git 不会打扰您。