Git init:致命:无法将'core.filemode'设置为'false'

时间:2018-04-30 21:19:27

标签: git teamcity gitlab

使用Team City从Git Repo中查看。 (Gitlabs如果重要的话)

从Empty build目录开始。收到此错误:

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

(在Windows机器上运行,如果这很重要)

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

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

擦除整个“工作”目录无济于事。

它随机出现......

和此: git config --global --replace-all core.fileMode false

没有任何用处 - 无论有没有--replace-all,以管理员身份运行,或以其他用户身份运行(如果将'false'更改为'true',则会出现相同的错误,如果将其更改为'falseCD'它将错误更改为无效值 - 显然,它正在改变它。

有人有任何想法吗?

2 个答案:

答案 0 :(得分:1)

Traderhunt Games traced this to some antivirus software,这是有道理的。原因与Git用于更新配置条目的过程有关。

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

  1. 使用创建文件的OS服务调用创建新的空文件(.git/config.lock),如果文件已存在则失败。如果此步骤失败,则表示另一个git config(或等效)命令已在运行,我们必须等待它完成,然后再执行我们自己的git config

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

    这里有一些关于允许重复的密钥的优点,而密钥只应该发生一次;有关详细信息,请参阅--replace-all--unset-all选项git config。请注意git config本身对大多数键和值对几乎一无所知,只要您选择Git今天没有使用的键并且将来不会使用它们,您就可以创建自己的键/值对。 。 (你如何弄清楚Git将会和将来不会使用什么,比如说,2043年,我不知道。:-))主要例外是一些core.*值,git config 了解,其他几个Git命令可以自行设置。

    (请注意,--unset的处理与替换非常相似。与非all替换一样,它只会取消第一个匹配key = value对的设置。取消设置只需不写给定的密钥,而不是编写替换key = value。由于git config只是逐行处理文件,这很容易另外,如果你的key = value是全新的,Git会通过阅读所有行来处理这一点,注意它没有替换任何现有的key,因此添加 a新的key = value行。由于键是逐段列出的,但逻辑本身很简单,这有点复杂。)

  3. 最后,阅读整个现有配置并完全写出新配置(根据需要使用fflushfsync以及fclose等等),{{ 1}}调用OS服务以重命名文件,以便将git config重命名为.git/config.lock在这种情况下,这是流程失败的地方。

  4. 重命名,如果成功,可以使新配置生效删除锁定文件,所有这些都是一个原子操作:任何其他Git命令都会看到完整的旧配置,来自原始.git/config文件或完整的新配置,来自构建期间已知为.git/config的新.git/config文件。

    另一个StackOverflow问题:Will we ever be able to delete an open file in Windows? accepted answer包括以下声明:无法打开启用了完全共享(包括删除)的文件的反病毒产品存在错误。如果是这种情况 - 也就是说,如果这个特定的AV软件无法打开“允许删除”标志,并且如果这样的软件有问题,那么这个特定的AV软件就是问题并且有问题。

答案 1 :(得分:1)

对于我来说,使用“ 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.