Git忽略gitconfig?
Git忽略gitconfig?
看起来Git正在忽略~/.gitconfig
文件。
$ git config --global core.filemode false $ git config -l core.filemode=false core.filemode=true
现在有两个core.filemode
的条目,但是Git仍然没有忽略文件模式的更改。
$ touch modetest $ git add . $ git commit -m test1 [master (root-commit) 320cfe4] test1 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 modetest $ chmod +x modetest $ git diff diff --git a/modetest b/modetest old mode 100644 new mode 100755
根据torek的回答,我在.bash_profile
中添加了这一行。
[ -d .git ] && git config core.filemode false
问题的出现原因是在Windows系统中,Git默认会将文件的权限信息作为版本控制的一部分,这就导致了在提交代码时会出现不必要的更改。为了解决这个问题,可以按照以下步骤进行操作:
1. 打开命令行工具,执行以下命令:
git config --global --unset core.filemode git config --unset core.filemode git config core.filemode false
这些命令的作用是取消Git的文件权限检查功能。
2. 在Git安装目录下的`C:\bin\Git\share\git-core\templates`文件夹中创建一个空的配置文件,并用记事本打开,可以使用以下命令来完成:
C:\bin\Git\share\git-core\templates>echo > config C:\bin\Git\share\git-core\templates>notepad config
3. 在打开的配置文件中添加以下内容:
[core]
filemode = false
通过以上步骤,可以解决`git init`命令返回`filemode = true`的问题,并且在新的Git文件夹(通过`git init`创建)中也会应用这个配置。
问题的原因是在Cygwin系统中,git在构建时会检查所构建的文件系统是否支持可执行位。而在通过源代码构建git时,默认情况下会将文件模式设置为true,这会导致.gitconfig文件被忽略。
解决方法是通过在Cygwin系统中从源代码构建git,并将构建后的二进制文件添加到系统路径中。具体步骤如下:
1. 在用户目录下创建一个名为"git"的文件夹:
cd ~/ mkdir git
2. 进入"git"文件夹并创建一个名为"inst"的文件夹:
cd git mkdir inst
3. 克隆git源代码到当前文件夹:
git clone -c core.autocrlf=false https://github.com/git/git.git
4. 进入git源代码文件夹:
cd git
5. 使用以下命令构建git,并指定安装目录为之前创建的"inst"文件夹:
NO_TRUSTABLE_FILEMODE=1 make prefix=/home/[用户名]/git/inst/
6. 使用以下命令安装构建后的git:
NO_TRUSTABLE_FILEMODE=1 make prefix=/home/[用户名]/git/inst/ install
7. 将以下内容添加到用户的.bashrc文件中,将构建后的git的bin目录添加到系统路径中:
export PATH=/home/[用户名]/git/inst/bin:$PATH
这样,在该Cygwin系统上进行git init和git clone操作时,默认的文件模式将被设置为false。关键是在构建过程中定义了NO_TRUSTABLE_FILEMODE变量。
Git ignoring gitconfig?
在创建或重新初始化新的仓库时,git init总是根据对文件系统的探测结果设置新的core.filemode的值。你只需要手动执行以下命令:
git config core.filemode false
或者:
git config --unset core.filemode
以使其遵循你的~/.gitconfig中的设置。如果再次运行git init,系统中的每个仓库设置都将恢复为true。
不太确定git实际上是如何实现的。我得去查看源代码。啊,找到了:它依赖于git构建时的配置项NO_TRUSTABLE_FILEMODE。如果未定义,它会在运行时通过chmod .git/config
来进行测试,然后将其替换为.git/config.lock
,从而清除临时chmod。临时版本会设置u+x位;如果chmod后仍然保持设置,则git认为x位是重要的。
这完全合理,但仍然令人沮丧,我不得不将一个项目从一台电脑复制到另一台电脑5次,直到我意识到发生了什么))谢谢!
谢谢,我知道git config --global core.fileMode false
是无效的。我每天都遇到git fileMode问题。每次创建新项目时,我都不得不配置这些东西。
在我的案例中正好相反。克隆后,本地的.git/config文件包含:[core] filemode = false。有任何想法为什么它决定它应该是false(在Windows 10上使用git bash for windows)?
Git的测试是:将.git/config
的chmod设置为+x,如果它是-x,或者设置为-x,如果它是+x。然后检查更改是否实际发生。如果是,新的替代.git/config.lock
文件将获得一个filemode = true
行。如果没有,新的替代.git/config.lock
文件将获得一个filemode = false
行。配置完成后,它将.git/config.log
重命名为.git/config
,并设置新的filemode设置。
由于你得到的是filemode = false
,说明Git尝试chmod文件失败:它是+x并保持+x,或者它是-x并保持-x。然而,如果实际的chmod工作,这意味着你的Git二进制文件是使用NO_TRUSTABLE_FILEMODE
选项构建的,它只是将"在克隆/初始化时进行测试"替换为"无条件设置为false"。要解决这个问题,你需要构建(或获取)一个新的Git二进制文件,而不是使用该选项构建的。