如何防止在Cygwin上使用git时设置core.filemode=true

13

我在Windows电脑上的Cygwin安装中使用git。虽然Cygwin在NTFS文件系统上支持Unix权限位,但像我的Eclipse这样的本地Windows程序不知道它们,因此所有由Windows程序创建的文件都设置了可执行位(755)。

我很少需要将设置了可执行位的文件提交到Git存储库中。因此,我希望默认情况下为core.filemode=false。我在全局配置中设置了此值,但不幸的是,通常没有效果:如文档所述,git clone探测文件系统以查看其是否支持权限,并相应地设置core.filemode,因此每个存储库配置中都有core.filemode=true配置,覆盖了我的期望默认值。

有没有办法防止git clone自动设置core.filemode


如果相关的话:我正在使用 git 版本 1.7.9。 - oberlies
3个回答

1

core.fileMode = true设置可以使用git hook自动清除。在这种情况下,我认为后检出钩子是最好的选择,它将在任何时候检出分支或克隆存储库时运行。创建名为post-checkout(无文件扩展名)的bash脚本,并包含以下内容:

#!/usr/bin/env bash

core_file_mode=$( git config --local core.fileMode )

if [[ "${OSTYPE}" == 'cygwin' && "${core_file_mode}" == 'true' ]]; then
    git config --local --unset core.fileMode
fi

如果您想将钩子应用于单个仓库,请将脚本放置在$GIT_DIR/hooks中(默认情况下,$GIT_DIR<path-to-your-repo>/.git)。如果想要将钩子应用于所有项目,请在全局gitconfig文件中添加以下条目:
[core]
    hooksPath = '<path-to-folder-containing-your-hook(s)>'

1

您可以设置Bash,使得每次使用cd命令时,它会检查该目录是否为存储库并正确设置。在您的~/.bash_profile文件中添加以下内容:

PROMPT_COMMAND=pc
pc () {
  [ -d .git -a ! -g .git/config ] || return
  git config core.filemode 0
  chmod +s .git/config
}

很高兴看到你不断改进你的回答。即使你似乎不再喜欢这个问题... - oberlies

0

通常的方法是使用 Git 模板目录初始化或克隆您的存储库。

 git clone --template=<template directory>

在该目录中,您可以指定一个配置文件,该文件将用作新初始化或克隆的存储库的本地git repo配置。 OP Oberlies 报告虽然它不适用于core.filemodecore.ignorecase,但对于git config man page

git-clonegit-init将在创建存储库时适当地探测并设置core.fileMode为false。


这个不起作用:git clonegit init都会覆盖配置模板中的core.filemode值。 - oberlies
@oberlies 哇,两个月后才回复 ;) 好的。你的Cygwin中git的版本是多少?有没有机会在Cygwin之外尝试使用msysgit?因为根据文档或http://monkeypatch.me/blog/mixing-professional-and-personal-git-configurations.html,`config`不应该被覆盖。 - VonC
可以通过模板中的config文件设置其他配置属性,但是git会覆盖模板中的core.filemodecore.ignorecase值。看起来,git只是试图变得过于聪明 - oberlies
1
@oberlies 很有趣。我已经将您的评论包含在答案中,以增加其可见性。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接