Git init:fatal:无法设置';core.filemode';至';假';

Git init:fatal:无法设置';core.filemode';至';假';,git,teamcity,gitlab,Git,Teamcity,Gitlab,使用Team City从Git回购中签出。(如果重要的话) 从空的构建目录开始。获取此错误: 致命:无法将“core.filemode”设置为“false” (在Windows计算机上运行,如果需要的话) 运行Team City的用户已更改为管理员,以防万一 当此命令退出时,.Git目录不是有效的Repo 擦除整个“工作”目录没有帮助 它随机来来去去 这是: git config--global--replace all core.fileMode false 无论是否使用--replace a

使用Team City从Git回购中签出。(如果重要的话)

从空的构建目录开始。获取此错误:

致命:无法将“core.filemode”设置为“false”

(在Windows计算机上运行,如果需要的话)

运行Team City的用户已更改为管理员,以防万一

当此命令退出时,.Git目录不是有效的Repo

擦除整个“工作”目录没有帮助

它随机来来去去

这是: git config--global--replace all core.fileMode false

无论是否使用--replace all,并以管理员或其他用户的身份运行(如果将'false'更改为'true',则会出现相同的错误,如果将其更改为'false CD',则会将错误更改为无效值-很明显,它正在更改它

有人有什么想法吗?

,这很有道理。原因与Git更新配置条目的过程有关

当运行
git config
并被告知更改一个或多个配置
key=value
字段时,例如将
core.filemode
更改为
false
,其实现方法是使用三步流程:

  • 使用创建文件的操作系统服务调用创建一个新的空文件(
    .git/config.lock
    ),如果该文件已经存在,则会失败。如果此步骤失败,则表示另一个
    git config
    (或等效项)命令已经在运行,我们必须等待它完成,然后才能执行自己的
    git配置

  • 读取现有配置文件,一次读取一个
    key=value
    条目。如果密钥是我们关心的密钥,则写入新的
    key=value
    值,否则复制现有的
    key=value

    这里有一些允许重复的键,而不是应该只出现一次的键;有关详细信息,请参见
    --替换所有的
    --将所有的
    选项取消设置到
    git config
    。请注意
    git config
    本身对大多数键和值对知之甚少或一无所知,您可以发明自己的键/v值对只要你选择Git现在不使用,将来也不会使用的键(你如何知道Git在2043年会用什么和不会用什么,我不知道.-)主要的例外是一些
    core.
    值,
    Git config
    确实理解,还有其他几个Git命令可以自己设置

    (请注意,
    --unset
    的处理方式与替换大致相同。与非
    all
    replace一样,它只取消第一个匹配的
    key=value
    对。取消设置是通过简单地不写给定的键来实现的,而不是写一个替换的
    key=value
    。因为
    git config
    只是通过如果你的
    key=value
    是全新的,Git通过阅读所有的行来处理它,注意到它没有替换任何现有的
    key
    ,因此添加一个新的
    key=value
    行。这有点复杂,因为键是一节一节列出的这是一个很好的解释,但逻辑本身很简单。)

  • 最后,通读了整个现有配置并完全写出了新配置(根据需要使用
    fflush
    fsync
    fclose
    等),
    git-config
    调用操作系统服务重命名文件,以便将
    .git/config.lock
    重命名为
    .git/config
    在这种特殊情况下,这就是进程失败的地方。

  • 如果重命名成功,则会将新配置生效并删除锁文件,这一切都是一个原子操作:任何其他Git命令都会从原始的
    .Git/config
    文件中看到完整的旧配置,或者从新的
    .Git/config
    文件中看到完整的新配置在构造过程中称为
    .git/config.lock

    另一个StackOverflow问题是:包含以下语句:未在启用完全共享(包括删除)的情况下打开文件的防病毒产品存在错误。如果是这种情况,即,如果此特定的AV软件无法使用“允许删除”打开如果这样的软件有缺陷,那么这个特定的AV软件就是问题所在,而且有缺陷。

    在我的情况下,使用“sudo”对我来说是有效的。例如:

    asif@asif-vm:/mnt/prog/protobuf_tut$ git clone https://github.com/protocolbuffers/protobuf.git
    Cloning into 'protobuf'...
    error: chmod on /mnt/prog/protobuf_tut/protobuf/.git/config.lock failed: Operation not permitted
    fatal: could not set 'core.filemode' to 'false'
    
    在完成“sudo”之后,我可以让它工作:

    asif@asif-vm:/mnt/prog/protobuf_tut$ sudo git clone https://github.com/protocolbuffers/protobuf.git
    Cloning into 'protobuf'...
    remote: Enumerating objects: 5, done.
    remote: Counting objects: 100% (5/5), done.
    remote: Compressing objects: 100% (5/5), done.
    remote: Total 66782 (delta 0), reused 0 (delta 0), pack-reused 66777
    Receiving objects: 100% (66782/66782), 55.83 MiB | 2.04 MiB/s, done.
    Resolving deltas: 100% (45472/45472), done.
    Checking out files: 100% (2221/2221), done.
    

    很明显,Git试图更改configuratino设置,但失败了。不清楚的是,为什么.Git会更新
    .Git/config
    ,方法是创建
    .Git/config.lock
    ,在那里写入新配置,然后将完成的
    .Git/config.lock
    重命名为
    .Git/config
    。如果其中一个步骤失败(无法创建.lock、无法写入.lock文件、无法将.lock文件重命名到位)出现上述错误。找出这三种情况中的哪一种以及原因。它刚刚创建了目录(之前没有.git),因此,如果有一个config.lock文件,那么这个进程只是将其作为“git init”命令的一部分创建。它在目录中创建了许多其他文件,包括“config”文件,它对运行git的进程的计算机具有完全的管理员访问权限。我相信,这排除了所有3个文件……因此,有一种方法可以解决这个问题这将是告诉git在编写完配置文件后不要更新配置文件。我在尝试将值设置为false和在另一个项目上设置为true时都看到了错误。我尝试使用--system而不是--global,但没有任何帮助。(甚至不确定)-哦,没有config.lock文件。如果它不能重命名该文件,它应该发出一个错误,如果它不能重新命名该文件,则会这样说(怀疑它会这样做)