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

时间:2013-01-10 21:19:21

标签: git executable file-permissions

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

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

2. git update-index --chmod=+x $script

有没有办法让git在git add期间简单地查看脚本的文件权限,而不是每次修复权限,认识到“嘿,这是一个可执行文件!”并直接使用exectuable权限将其添加到存储库?

6 个答案:

答案 0 :(得分:26)

git 2.9.X / 2。10(2016年第3季度)将chmod带到git add本身!

commit 4e55ed3Edward Thomson (ethomson)(2016年5月31日) 帮助:Johannes Schindelin (dscho)
(由Junio C Hamano -- gitster --commit c8b080a合并,2016年7月6日)

  

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

     

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

     

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

您可以在" How to create file execute mode permissions in Git on Windows?"中找到此新功能的来源。 (2011年2月)

答案 1 :(得分:12)

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

  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'
        
    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'
        
    3. 合并git和bash别名

      • 编辑您的bash个人资料文件:

        vim ~/.bashrc

      • 将其添加到文件末尾:

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

        vim ~/.gitconfig

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

        [alias]
            addscript = !sh -c 'git update-index --chmod=+x $0 && git add $0'
        
    4. 上述所有内容均未经过测试

答案 2 :(得分: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 

答案 3 :(得分:3)

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

  1. fileMode = true文件中设置.git/config(或按其他人指出的方式运行git config core.filemode true
  2. 更改文件权限的可执行位并提交此更改。 (正如你所指出的chmod u+x $script)。你只需要这样做一次。
  3. 推送到遥控器
  4. 下次你从那里开始,git会在文件上设置提交的可执行位。我也有类似的问题,这解决了它们。

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

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

答案 4 :(得分:1)

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

看一下预提交钩子。

http://git-scm.com/book/en/Customizing-Git-Git-Hooks

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

Theres a gotcha。确保您的脚本首先运行git stash -q,以便您处理实际的分阶段文件版本。

答案 5 :(得分:0)

我刚刚通过Tortoise Git文件夹更新添加了。右键单击所有文件,然后将“执行许可权”复选框更新为true,然后使用消息进行提交/推送。 Git命令行添加/提交也应该起作用。