我经常将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权限将其添加到存储库?
答案 0 :(得分:26)
git 2.9.X / 2。10(2016年第3季度)将chmod
带到git add
本身!
commit 4e55ed3见Edward 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)
有几种方法可以做到这一点。
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'
上述所有内容均未经过测试
答案 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脚本的解决方案:
fileMode = true
文件中设置.git/config
(或按其他人指出的方式运行git config core.filemode true
)chmod u+x $script
)。你只需要这样做一次。下次你从那里开始,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命令行添加/提交也应该起作用。