自动将“git update-index –chmod + x”应用于可执行文件
我经常将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
期间查看脚本的文件权限,认识到“嘿,这是一个可执行文件! 并直接将它添加到存储库的可执行权限?
有几种方法可以做到这一点。
- Git别名
- Bash别名
- 甚至结合bash和git别名
-
Git别名
你总是可以在你的git别名中使用bash。
-
打开你的gitconfiguration:
vim ~/.gitconfig
-
添加一个别名部分(如果不存在):
[alias] addscr = !sh -c 'if [[ ${0: -3} == ".sh" ]]; then git update-index --chmod=+x $0; git add $0'
-
-
Bash别名
-
编辑你的bashconfiguration文件:
vim ~/.bashrc
-
在文件末尾加上这个:
function gitadd(){ if [[ ${1: -3} == ".sh" ]] then git update-index --chmod=+x $1 fi git add $1 } alias gitadd='gitadd'
-
-
结合git和bash别名
-
编辑你的bashconfiguration文件:
vim ~/.bashrc
-
将其添加到文件的末尾:
function checkShellFile(){ return ${1: -3} == ".sh" } alias gitadd='checkShellFile ? git addsrcipt "$1" : && git add "$1"'
-
编辑你的gitconfiguration文件:
vim ~/.gitconfig
-
添加一个别名部分(如果不存在):
[alias] addscript = !sh -c 'git update-index --chmod=+x $0 && git add $0'
-
以上都没有经过testing
git 2.9.X / 2.10(2016年第3季度)将chmod
git add
到git add
自身中!
见Edward Thomson( ethomson
) 提交的4e55ed3 (2016年5月31日) 。
帮助: Johannes Schindelin( dscho
) 。
(由Junio C gitster
合并- gitster
-在提交c8b080a ,2016年7月6日)
add
:add--chmod=+x
/--chmod=-x
选项对于
core.filemode
设置为false的存储库中的path,可执行位将不会被检测到(因此不会被设置),尽pipe用户可能仍希望将文件添加为可执行文件,以便与具有core.filemode
其他用户function。
例如,添加shell脚本的Windows用户可能希望将其添加为可执行文件,以便与非Windows上的用户兼容。虽然这可以通过pipe道命令(
git update-index --add --chmod=+x foo
)来完成,但教导git-add
命令允许用户使用他们已经熟悉的命令设置文件可执行文件 。
您可以在“ 如何在Windows上的Git中创build文件执行模式权限? ”(2011年2月)中看到此新function的来源。
这里是一个脚本来自动应用“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
没有花哨的bash脚本的解决scheme :
- 在你的
.git/config
文件中设置fileMode = true
(或者像别人指出的那样运行git config core.filemode true
) - 更改文件权限上的可执行位并提交此更改。 (你指出了
chmod u+x $script
)。 你只需要做一次。 - 推到遥控器
下一次你从那里拉,git会设置文件上提交的可执行位。 我也有类似的问题,这解决了他们。
fileMode = true
告诉git跟踪它可以执行的唯一权限:可执行位。 这意味着对可执行位的更改将被git识别为工作树中的更改,并且这些更改将随着下一次提交而存储在repo中。
一旦你提交了所需的可执行文件位,你也可以将你的fileMode
重置为false
这样下次git在你不想提交时就不会打扰你了。
我不认为这可以在git add
命令上完成,但是在运行git commit
命令之后但是在实际创buildcommit之前,您可能会运行一个脚本。
看看预先提交的钩子。
http://git-scm.com/book/en/Customizing-Git-Git-Hooks
基本上只需要在你的.git / hooks /文件夹中创build一个名为pre-commit的文件。 (钩子文件夹中应该有样本,重命名它们以删除最后的“.sample”以激活一个。)
这是一个陷阱。 确保你的脚本首先运行git stash -q
这样你就可以在实际的分阶段版本的文件上工作。