0


如何让 Git 忽略文件模式 (chmod) 更改?

问:

我有一个项目,我必须在开发时将带有 chmod 的文件模式更改为 777,但不应在主仓库中更改。

Git 选择 chmod -R 777 . 并将所有文件标记为已更改。有没有办法让 Git 忽略对文件所做的模式更改?

答1:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

尝试:

git config core.fileMode false

从 git-config(1):

core.fileMode 告诉 Git 工作树中文件的可执行位是否要被接受。某些文件系统在签出标记为可执行文件的文件时会丢失可执行位,或者签出带有可执行位的不可执行文件。 git-clone(1) 或 git-init(1) 探测文件系统以查看它是否正确处理可执行位,并且此变量会根据需要自动设置。但是,存储库可能位于正确处理文件模式的文件系统上,并且此变量在创建时设置为 true,但稍后可能会从丢失文件模式的另一个环境访问(例如,通过 CIFS 挂载导出 ext4,访问 Cygwin使用 Git for Windows 或 Eclipse 创建存储库)。在这种情况下,可能需要将此变量设置为 false。请参阅 git-update-index(1)。默认值为 true(当配置文件中未指定 core.filemode 时)。

-c 标志可用于为一次性命令设置此选项:

git -c core.fileMode=false diff

键入 -c core.fileMode=false 可能很麻烦,因此您可以为所有 git 存储库或仅为一个 git 存储库设置此标志:

# this will set your the flag for your user for all git repos (modifies `$HOME/.gitconfig`)
git config --global core.fileMode false

# this will set the flag for one git repo (modifies `$current_git_repo/.git/config`)
git config core.fileMode false

此外,如 Git global core.fileMode false overridden locally on clone 中所述,git clone 和 git init 在 repo 配置中将 core.fileMode 显式设置为 true

警告

core.fileMode 不是最佳做法,应谨慎使用。此设置仅涵盖模式的可执行位,而不涵盖读/写位。在许多情况下,您认为需要此设置是因为您执行了 chmod -R 777 之类的操作,使您的所有文件都可执行。但在大多数项目中,出于安全原因,大多数文件不需要也不应该是可执行文件。

解决这种情况的正确方法是分别处理文件夹和文件权限,例如:

find .-type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find .-type f -exec chmod a+rw {} \;  # Make files read/write

如果您这样做,您将永远不需要使用 core.fileMode,除非在非常罕见的环境中。

如果您执行 git config --global core.filemode false,您只需为所有 repos 执行一次。
在我修复了应该是 fileMode 而不是 filemode 的情况之前,这对我不起作用
@tishma:Git 配置部分和变量名是 case insensitive according to the documentation, see the CONFIGURATION FILE section,所以如果上面的方法对你不起作用,那是因为不同的原因。
@donquixote:git config 命令将设置写入正确的配置文件(.git/config 仅用于当前存储库,或者 ~/.gitconfig 如果与 --global 一起使用)。
@zx1986:没关系。来自 git config:“变量名不区分大小写,...”

答2:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

撤消工作树中的模式更改:

git diff --summary | grep --color 'mode change 100755=>100644' | cut -d' '-f7-| xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644=>100755' | cut -d' '-f7-| xargs -d'\n' chmod -x

或者在 mingw-git

git diff --summary | grep  'mode change 100755=>100644' | cut -d' '-f7-| xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644=>100755' | cut -d' '-f7-| xargs -e'\n' chmod -x

或者在 BSD/macOS 中

git diff --summary | grep --color 'mode change 100644=>100755' | cut -d' '-f7-| tr '\n''\0'| xargs -0 chmod -x
git diff --summary | grep --color 'mode change 100755=>100644' | cut -d' '-f7-| tr '\n''\0'| xargs -0 chmod -x

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

在 OS X Lion 上,省略 xargs 中的 -d'\n' 部分,因为这是一个非法参数(并且不需要)。
您可以忽略任何有关“chmod:‘+x’后缺少操作数”的错误
这是最新的吗?我在 mingw 中得到“chmod:参数太少”
@Pascal @pimlottc -d 将分隔符指定为换行符而不是任何空格。 BSD xargs 没有该选项,但您可以通过 tr '\n' '\0' 管道输出,然后使用 -0 arg 到 xargs 以使用 NUL 作为分隔符。
太棒了,tr 的事情奏效了!这是 OSX 的完整命令:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x

答3:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

如果要为所有存储库设置此选项,请使用 --global 选项。

git config --global core.filemode false

如果这不起作用,您可能正在使用较新版本的 git,因此请尝试 --add 选项。

git config --add --global core.filemode false

如果你在没有 --global 选项的情况下运行它并且你的工作目录不是一个 repo,你会得到

error: could not lock config file .git/config:No such file or directory

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

看起来以后的 GIT 使用 --add,如 git config --add --global core.filemode false
如果 repo 的本地配置已经具有 filemode=true 则更改全局配置将无济于事,因为本地配置将覆盖全局配置。将不得不更改机器的每个 repo 的本地配置一次
请:用 syedrakib 的警告更新这个答案!在我发现它之前,一切都感觉很疯狂,之后又变得完全合理。

答4:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

如果

git config --global core.filemode false

对您不起作用,请手动执行:

cd into yourLovelyProject folder

cd 进入 .git 文件夹:

cd .git

编辑配置文件:

nano config

将 true 更改为 false

[core]
        repositoryformatversion =0
        filemode =true

->

[core]
        repositoryformatversion =0
        filemode =false

保存,退出,进入上层文件夹:

cd ..

重新初始化 git

git init

你完成了!

无需编辑 .git/config,只需在项目的根目录中添加一个简单的 git config core.fileMode false 即可。如果您编辑配置文件,最好完全删除该指令,以便获取全局指令。
-1 如果 git config --global 不起作用,则意味着您没有在系统级别执行此操作的权限,删除 global 选项与手动编辑 .git/config 完全相同
@CharlesB 不正确 - 答案提供了一种解决方法,将选项直接放在项目中,使其特定于项目。这不适用于您将来制作/结帐的其他 git 项目,但适用于您正在处理的项目。 (让我们确保我们消除了 ~/.gitconfig 和 ~/project/.git/config 的歧义)
运行 git init 后,我们应该将 filemode 设置回 true 吗?
git init 将文件模式返回 TRUE!

答5:

huntsbot.com – 高效赚钱,自由工作

添加到 Greg Hewgill answer(使用 core.fileMode 配置变量):

您可以使用 git update-index 的 --chmod=(-|+)x 选项(“git add”的低级版本)来更改索引中的执行权限,如果您使用“git commit”(而不是“git commit -一个”)。

这应该已被编辑到 Greg Hewgill 的答案中,而不是作为单独的答案添加,从而创建一个具有单一明确表示的最高答案。
@Greg:需要有足够的分数来编辑不是自己的答案;我想我当时没有足够的编辑权限。
@Jakub 我认为你现在有足够的声誉:) 这个命令对于示例文件会是什么样子?

答6:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

您可以全局配置它:

git config --global core.filemode false

如果上述方法对您不起作用,原因可能是您的本地配置覆盖了全局配置。

删除本地配置,使全局配置生效:

git config --unset core.filemode

或者,您可以将本地配置更改为正确的值:

git config core.filemode false

如果主要答案对您没有帮助 - 试试这个。如果您想检查本地配置而不修改它,请检查 git config -l(列出当前配置 - 本地和全局)
删除本地配置是 global 对我不起作用的原因。谢谢!

答7:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

如果您已经使用过 chmod 命令然后检查文件的差异,它显示以前的文件模式和当前的文件模式,例如:

新模式:755

旧模式:644

使用以下命令设置所有文件的旧模式

sudo chmod 644 .

现在使用命令或手动在配置文件中将 core.fileMode 设置为 false。

git config core.fileMode false

然后应用 chmod 命令更改所有文件的权限,例如

sudo chmod 755.

并再次将 core.fileMode 设置为 true。

git config core.fileMode true

对于最佳实践,不要始终保持 core.fileMode 为 false。

您是说整个项目(在开发、暂存和生产中)应该是 755 吗?
@Daniel Feb:不。仅更改必要文件的模式。
For best practises don't Keep core.fileMode false always 你是什么意思,你应该解释一下。
For best practises don't Keep core.fileMode false always. 某些文件系统(例如 FAT)不支持文件权限,因此操作系统会报告一个默认值(无论如何在我的系统上都是 766)。在这种情况下,core.filemode 在本地配置中是绝对必要的,除非您想通过不必要和无意的权限更改来膨胀提交历史记录
另外,你为什么还要费心把烫发改回来呢?如果设置 core.filemode=false 则 git 将忽略执行位更改,无需更改本地权限。除非您已经向索引添加了权限更改,否则您会错过关闭 core.filemode 后需要执行 git add 的步骤。

答8:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

通过定义以下别名(在 ~/.gitconfig 中),您可以轻松地暂时禁用每个 git 命令的 fileMode:

[alias]
nfm ="!f(){ git -c core.fileMode=false $@; };f"

当此别名作为 git 命令的前缀时,文件模式更改将不会与原本会显示它们的命令一起显示。例如:

git nfm status
为什么不只是一个预提交钩子而不是一个可忘记的参数?

答9:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

如果您想在配置文件中递归地将文件模式设置为 false(包括子模块):find -name config | xargs sed -i -e ‘s/filemode = true/filemode = false/’

如果该行不在配置文件中,这将不起作用。如果您想为子模块更改它,请尝试以下操作:git submodule foreach git config core.fileMode false

答10:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

简单的解决方案:

在项目文件夹中点击此简单命令(它不会删除您的原始更改)…它只会删除在您更改项目文件夹权限时所做的更改

命令如下:

git config core.fileMode false

为什么要修改所有不必要的文件:因为您已使用推荐更改了项目文件夹权限 sudo chmod -R 777 ./yourProjectFolder

你什么时候会检查你没有做过的改变?您在使用 git diff 文件名时发现如下

old mode 100644new mode 100755

答11:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

这对我有用:

find .-type f -exec chmod a-x {} \;

或反向,具体取决于您的操作系统

find .-type f -exec chmod a+x {} \;
这会改变文件的权限,但不会让 git 忽略文件的文件权限。
好吧,你是对的,这并不能解决 git ignore 的事情。

原文链接:https://www.huntsbot.com/qa/07BM/how-do-i-make-git-ignore-file-mode-chmod-changes?lang=zh_CN&from=csdn

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

标签: git github ogre

本文转载自: https://blog.csdn.net/kalman2019/article/details/128490420
版权归原作者 HuntsBot 所有, 如有侵权,请联系我们删除。

“如何让 Git 忽略文件模式 (chmod) 更改?”的评论:

还没有评论