Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动应用";git更新索引--chmod=&x2B;x";到可执行文件_Git_Executable_File Permissions - Fatal编程技术网

自动应用";git更新索引--chmod=&x2B;x";到可执行文件

自动应用";git更新索引--chmod=&x2B;x";到可执行文件,git,executable,file-permissions,Git,Executable,File Permissions,我经常将bash脚本添加到我的git存储库中,并且这些脚本在git add之前在linux文件系统中具有可执行权限。但在将添加的文件推送到远程存储库并拉入另一个位置后,这些文件显示为不可执行权限。似乎有两种方法可以解决此问题: 1. chmod u+x $script git commit -am "fixing the script permissions... again..." 或 有没有办法让git在git add期间查看脚本上的文件权限,识别“嘿,这是一个可执行文件!”并直接

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

1. chmod u+x $script 
   git commit -am "fixing the script permissions... again..."


有没有办法让git在
git add
期间查看脚本上的文件权限,识别“嘿,这是一个可执行文件!”并直接将其添加到具有可执行权限的存储库中,而不是每次都固定权限

我不认为这可以在
git add
命令上完成,但是您可以在运行
git commit
命令之后,但在实际创建commit之前运行脚本

看看预提交钩子

基本上,只需在.git/hooks/文件夹中创建一个名为pre-commit的文件。 (hooks文件夹中应该已经有示例,重命名它们以删除结尾处的“.sample”以激活一个示例。)


有个问题。确保您的脚本首先运行
git stash-q
,以便您处理文件的实际阶段版本

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

  • Git别名
  • Bash别名
  • 甚至可以组合bash和git别名
  • Git别名

    您可以在git别名中始终使用bash

    • 打开git配置:

      vim~/.gitconfig

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

      [别名]
      addscr=!sh-c'if[${0:-3}==“.sh”];然后git更新索引--chmod=+x$0;git添加$0'
      
  • Bash别名

    • 编辑bash配置文件:

      vim~/.bashrc

    • 在文件末尾添加以下内容:

      函数gitadd(){ 如果[${1:-3}=“.sh”]] 然后git更新索引--chmod=+x$1 fi 吉特加1美元 } 别名gitadd='gitadd'
  • 组合git和bash别名

    • 编辑bash配置文件:

      vim~/.bashrc

    • 将以下内容添加到文件末尾:

      函数checkShellFile(){
      返回${1:-3}=“.sh”
      }
      别名gitadd='checkShellFile?git addsrcipt“$1”:&&git add“$1”
      
    • 编辑git配置文件:

      vim~/.gitconfig

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

      [别名]
      addscript=!sh-c'git更新索引--chmod=+x$0&&git添加$0'
      

  • 以上所有内容均未经测试

    以下是一个脚本,可自动将
    git更新索引--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 
    

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

  • .git/config
    文件中设置
    fileMode=true
    (或者像其他人指出的那样运行
    git-config-core.fileMode-true
  • 更改文件权限上的可执行位并提交此更改。(
    chmodu+x$script
    正如您所指出的)。你只需要做一次
  • 按遥控器
  • 下次您从那里提取时,git将在文件上设置提交的可执行位。我也有类似的问题,这就解决了

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

    一旦您提交了所需的可执行位,您还可以将您的
    文件模式
    重置为
    false
    ,这样下次当您不想提交这些更改时,git就不会因为这些更改而困扰您。

    git 2.9.X/2.10(2016年第三季度)将
    chmod
    带到
    git add
    本身

    参见(2016年5月31日)作者。
    帮助人:。
    (于2016年7月6日被合并)

    add
    :添加
    --chmod=+x
    /
    --chmod=-x
    选项 将不会检测到可执行位(因此不会 对于
    core.filemode
    设置为false的存储库中的路径, 尽管用户可能仍然希望添加文件作为 与具有
    core.filemode
    功能。
    例如,添加shell脚本的Windows用户可能希望将其添加为可执行文件,以便与非Windows上的用户兼容

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


    您可以在“”(2011年2月)中看到此新功能的来源。

    我刚刚通过“Tortoise Git文件夹更新”添加了此功能。右键单击所有文件,并将“执行权限”复选框更新为true,并使用消息提交/推送。Git命令行add/commit也应该可以工作。

    另一个位置使用的是
    filemode=false
    ?这两个位置都运行linux,因此没有
    filemode=false
    问题。我认为这是git的正常行为——我只是在寻找跳过手动修复步骤的方法。githooks主页上有指针。很快git 2.9/2.10(2016年第3季度)就可以使用一个简单的
    git add--chmod=+x
    了!看。如果这是.gittributes规范的一部分,那就太棒了。比如<代码>*.sh text eol=lf 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