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

Tra*_*mes 12 git teamcity gitlab

使用 Team City 从 Git 存储库中签出。(如果重要的话,Gitlabs)

从空构建目录开始。得到这个错误:

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

(如果重要的话,在 Windows 机器上运行)

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

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

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

它随机来来去去......

还有这个: git config --global --replace-all core.fileMode false

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

有人有任何想法吗?

Bla*_*g23 48

我讨厌成为那样的人,但我通过重新启动 Windows 解决了这个问题。

  • 我也通过重新启动windows解决了这个问题 (10认同)
  • 谢谢你的笑声,哈哈。顺便说一句,你也解决了这个问题 (9认同)
  • 这听起来很愚蠢,但本质上是正确的,因为 @LouisGo 所说的 - 不过,您需要重新启动的只是 WSL/WSL2,Windows 重新启动将覆盖它,但这有点矫枉过正。从提升的 shell 中执行“wsl --shutdown”就足够了,然后再次启动它(WSL)。 (4认同)
  • 如果您使用 WSL2 并克隆到主目录下,那么这是正确的答案。wsl 的主目录在第一个位置时指向 Windows 用户目录。当主机重新启动时,您的主目录将恢复正常。 (3认同)

lin*_*ack 34

在我的情况下,使用“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'
Run Code Online (Sandbox Code Playgroud)

做了一个“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.
Run Code Online (Sandbox Code Playgroud)

  • 我想,也为我工作过。就我而言,我在 Windows 10 中的 WSL 内部克隆到 Windows 目录的符号链接(“/mnt/c/mydir/...”)。 (7认同)
  • 那么看起来像是权限问题。我们如何通过正确的“chmod”来解决这个问题? (3认同)

tor*_*rek 5

Traderhunt Games 将此追溯到某些防病毒软件,这是有道理的。原因与 Git 用于更新配置条目的过程有关。

\n\n

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

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

  2. \n
  3. 读取现有的配置文件,key = value一次一项。如果键是我们关心的键,则写入 key = value值,否则复制现有的key = value

    \n\n

    这里有一些奇特之处,即允许重复的键与只能出现一次的键;有关详细信息,请参阅--replace-all--unset-all选项git config。请注意,git config它本身对大多数键和值对知之甚少甚至一无所知,只要您选择 Git 目前不使用且将来也不会使用的键,您就可以发明自己的键/值对。(你如何确定 Git 在 2043 年将使用和不会使用什么,我不知道。:-) )主要的例外是一些值core.*,这git config 确实理解,并且其他几个 Git 命令可能会自己设置。

    \n\n

    (请注意,--unset处理方式与替换非常相似。与非all替换一样,它仅取消设置第一个匹配key = value对。取消设置是通过简单地不写入给定键而不是写入替换来实现的key = value。因为git config只是通过文件行进行操作逐行,这很容易做到。另外,如果你key = value是全新的,Git 会通过读取所有行来处理这个问题,注意到它没有替换任何现有的key,因此添加一个新key = value行。这很复杂事实上,按键是逐节列出的,但逻辑本身很简单。)

  4. \n
  5. 最后,读完整个现有配置并完全写出新配置(根据需要使用fflushfsync等等),调用操作系统服务来重命名文件,以便重命名为. 在这种特殊情况下,这就是该过程失败的地方。fclosegit config.git/config.lock.git/config

  6. \n
\n\n

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

\n\n

StackOverflow 的另一个问题是:我们是否能够删除 Windows 中打开的文件?接受的答案 包括以下声明:不打开启用完全共享(包括删除)的文件的防病毒产品是有缺陷的。 如果是这种情况\xe2\x80\x94,也就是说,如果这个特定的 AV 软件无法使用“允许删除”标志打开,并且如果此类软件有错误,那么这个特定的 AV 软件就是问题所在并且有错误。

\n