自动将“git update-index --chmod=+x”应用于可执行文件

idfiyjo8  于 2023-04-19  发布在  Git
关注(0)|答案(7)|浏览(110)

我经常在我的Git仓库中添加bash脚本,这些脚本在git add之前的Linux文件系统中具有可执行权限。但是在将添加的文件推送到远程仓库并拉入另一个位置后,这些文件显示为不可执行权限。似乎有两种方法可以纠正这个问题:
1.

chmod u+x $script 
git commit -am "fixing the script permissions... again..."
git update-index --chmod=+x $script

有没有一种方法可以让Git在git add期间查看脚本上的文件权限,识别“Hey,this here is an executable file!”并直接将其添加到具有可执行权限的存储库中,而不是每次都修改权限?

b4lqfgs4

b4lqfgs41#

git 2.9.X/2.10(Q3 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选项

对于core.filemode设置为false的存储库中的路径,可执行位将不会被检测到(因此不会被设置),尽管用户可能仍然希望将文件添加为可执行文件,以便与其他 * 有 * core.filemode功能的用户兼容。
例如,添加shell脚本的Windows用户可能希望将它们添加为可执行文件,以便与非Windows用户兼容。
虽然这可以通过plumbing命令(git update-index --add --chmod=+x foo)完成,但教授git-add命令允许用户使用他们已经熟悉的命令设置文件可执行文件
你可以在“How to create file execute mode permissions in Git on Windows?”(2011年2月)中看到这个新特性的起源。

zvms9eto

zvms9eto2#

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

  1. Git别名
  2. Bash别名
    1.或者甚至将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'

以上均未测试

h5qlskok

h5qlskok3#

下面是一个自动将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
h7wcgrx3

h7wcgrx34#

不需要花哨的bash脚本

1.在您的.git/config文件中设置fileMode = true(或者像其他人指出的那样运行git config core.filemode true
1.更改文件权限上的可执行位并提交此更改。(如您所指出的chmod u+x $script)。您只需执行一次。
1.推到遥控器
下一次你从那里拉取的时候,git会在文件上设置提交的可执行位。我也有类似的问题,这个解决了他们。
fileMode = true告诉git跟踪它唯一可以跟踪的权限:可执行位。这意味着对可执行位的更改将被git识别为工作树中的更改,并且这些更改将在下次提交时存储在repo中。
一旦你提交了你想要的可执行文件,你也可以将fileMode重置为false,这样下次当你不想提交它们时,git就不会用这样的更改来打扰你了。

pgvzfuti

pgvzfuti5#

我不认为这可以在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,这样你才能处理文件的实际暂存版本。

q3aa0525

q3aa05256#

我刚刚添加了通过' Tortoise Git文件夹更新。右键单击所有文件并将执行权限复选框更新为true并提交/推送消息。Git命令行添加/提交也应该可以工作。

hwazgwia

hwazgwia7#

如果你在windows/powershell上,只需相应地更改路径和过滤器:

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

相关问题