自动将“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”应用于可执行文件的主要内容,如果未能解决你的问题,请参考以下文章