自动将“ 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期间简单地查看脚本上的文件权限,而不是每次都修复权限,认识到“嘿,这是一个可执行文件!”并将其直接添加到具有可执行权限的存储库中?

91898 次浏览

我不认为在 git add命令中可以做到这一点,但是您可以在运行 git commit命令之后、在实际创建提交之前立即运行一个脚本。

看一下提前提交钩子。

Http://git-scm.com/book/en/customizing-git-git-hooks

基本上就是在. git/hooks/文件夹中创建一个名为 pre-commit 的文件。 (钩子文件夹中应该已经有示例,重命名它们以删除“。样本」 ,以启动一个。)

抓到你了。确保您的脚本首先运行 git stash -q,这样您就可以处理文件的实际阶段版本。

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

  1. Git 化名
  2. Bash 化名
  3. 甚至可以把 bash 和 git 别名结合起来
  1. Git 化名

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

    • 打开你的 git 配置:

      vim ~/.gitconfig

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

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

    • Edit your bash profile file:

      vim ~/.bashrc

    • Add this at the end of the file:

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

    • Edit your bash profile file:

      vim ~/.bashrc

    • Add this to the end of the file:

      function checkShellFile(){
      return ${1: -3} == ".sh"
      }
      alias gitadd='checkShellFile ? git addsrcipt "$1" : && git add "$1"'
      
    • Edit your git config file:

      vim ~/.gitconfig

    • Add an aliases section to it (if one does not exist):

      [alias]
      addscript = !sh -c 'git update-index --chmod=+x $0 && git add $0'
      

None of the above has been tested

下面是一个自动将 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 脚本的解决方案 :

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

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

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

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

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

犯罪现场调查,第四季,第5集(2016年5月31日) by 爱德华 · 汤姆森(ethomson)
帮助者: 约翰内斯 · 辛德林(dscho)
(由 朱尼奥 · C · 哈马诺 gitster于2016年7月6日在 提交 c8b080a合并)

add: 添加 --chmod=+x/--chmod=-x选项

可执行位将不会被检测到(因此也不会被检测到) 如果 core.filemode设置为 false,则对于存储库中的路径, 尽管用户可能仍然希望将文件添加为 与 拥有 core.filemode的其他用户的兼容性 功能。
例如,添加 shell 脚本的 Windows 用户可能希望将它们添加为可执行文件,以便与非 Windows 用户兼容。

虽然这可以通过管道命令(git update-index --add --chmod=+x foo)、 教授 git-add命令允许用户使用他们已经熟悉的命令设置一个文件可执行文件来完成。

你可以在“ 如何在 Windows 上创建 Git 中的文件执行模式权限?”(2011年2月)中看到这个新特性的起源

我刚刚通过’乌龟 Git 文件夹更新。右键单击所有文件并将执行权限复选框更新为 true 并使用消息提交/推送。Git 命令行 add/commit 也应该可以工作。

如果使用的是 windows/powershell,只需要相应地更改路径和过滤器:

Get-ChildItem -Path . -Filter '*.py' -Recurse | Select-Object { git -update-index --chmod=+x $_.Name }