自动将“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期间查看脚本的文件权限,认识到“嘿,这是一个可执行文件! 并直接将它添加到存储库的可执行权限?

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

  1. Git别名
  2. Bash别名
  3. 甚至结合bash和git别名
  1. Git别名

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

    • 打开你的gitconfiguration:

      vim ~/.gitconfig

    • 添加一个别名部分(如果不存在):

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

    • 编辑你的bashconfiguration文件:

      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别名

    • 编辑你的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 addgit 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

  1. 在你的.git/config文件中设置fileMode = true (或者像别人指出的那样运行git config core.filemode true
  2. 更改文件权限上的可执行位并提交此更改。 (你指出了chmod u+x $script )。 你只需要做一次。
  3. 推到遥控器

下一次你从那里拉,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这样你就可以在实际的分阶段版本的文件上工作。