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

Posted

技术标签:

【中文标题】自动将“git update-index --chmod=+x”应用于可执行文件【英文标题】:Automatically apply "git update-index --chmod=+x" to executable files 【发布时间】:2012-12-25 09:39:17 【问题描述】:

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

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

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

【问题讨论】:

其他位置是否使用filemode=false 两个位置都在运行 linux,所以不存在 filemode=false 问题。我认为这是 git 的正常行为——我只是在寻找某种方法来跳过手动修复步骤。 githooks 手册页有指针。 很快就会使用 git 2.9/2.10(2016 年第三季度),一个简单的 git add --chmod=+x 就足够了!见my answer below。 如果这是 .gitattributes 规范的一部分,那就太棒了。像... *.sh text eol=lf chmod=+x 【参考方案1】:

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

看看 pre-commit 钩子。

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

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

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

【讨论】:

【参考方案2】:

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

    Git 别名 Bash 别名 甚至结合 bash 和 git 别名

    Git 别名

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

    打开你的 git 配置:

    vim ~/.gitconfig

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

    [alias]
        addscr = !sh -c 'if [[ $0: -3 == ".sh" ]]; then git update-index --chmod=+x $0; git add $0'
    

    Bash 别名

    编辑您的 bash 配置文件:

    vim ~/.bashrc

    在文件末尾添加:

    function gitadd()
        if [[ $1: -3 == ".sh" ]]
            then git update-index --chmod=+x $1
        fi
        git add $1
     
     alias gitadd='gitadd'
    

    结合 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'
    

以上均未经过测试

【讨论】:

无需谷歌搜索:是否可以在每个 repo 的基础上执行此操作?在构建代理的情况下,我想事先知道所有签出都确保正确的权限...... :)【参考方案3】:

这是一个自动将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 

【讨论】:

【参考方案4】:

无需花哨的 bash 脚本的解决方案

    在您的.git/config 文件中设置fileMode = true(或通过运行git config core.filemode true,正如其他人指出的那样) 更改文件权限的可执行位并提交此更改。 (chmod u+x $script 正如你所指出的)。您只需执行一次。 推送到遥控器

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

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

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

【讨论】:

【参考方案5】:

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

见commit 4e55ed3(2016 年 5 月 31 日)Edward Thomson (ethomson)。 帮助者: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 月)中看到这个新功能的起源

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于自动将“git update-index --chmod=+x”应用于可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将自动布局添加到肋骨中添加的现有自动布局视图

自动交换和将代码直接推送到生产之间有啥区别?

如果自动重试之一成功,条带会自动将预订设置回'active'吗?

自动布局将两个标签彼此相邻对齐

如何自动将设备添加到配置文件?

将 UIImageView 与自动布局对齐