为什么从特定 GitHub 存储库合并到本地 Git 存储库会导致本地存储库发生未提交的更改?

Why does merging from a particular GitHub repository into a local Git repository result in uncommitted changes in the local repository?

我有2个GitHub repos,我们称它们为GH1GH2,以及2个对应的本地repos,我们调用他们 LR1LR2 将它们作为遥控器。为清楚起见,这里是本地回购到远程回购的映射:
LR1 ---> GH1
LR2 ---> GH2

我手动上传(并提交)同一个文件,我们称它为 A.jpg,使用 GitHub 到两个 GitHub 存储库网络 UI。 当我尝试从远程合并回我的本地存储库时,我得到了不同的结果。

为了解决这个问题,我在命令行上使用 git。

其中一个本地存储库 (LR1) 的行为符合我的预期: git fetch 从远程获取更改但不合并它。 git merge 合并 A.jpg 并快进本地仓库。 git status 显示“没有要提交的内容,工作目录干净”

另一个 (LR2) 的行为与我预期的不同: git fetch 从远程获取更改但不合并它。 git merge 合并 A.jpg 并快进本地仓库。 git status表示A.jpg被修改,是未提交的变更。

git pull 对于 2 个本地存储库的行为方式相同,但为了解决这个问题,我想我会明确调用 2 个命令(git fetchgit merge) 做与拉动相同的事情。

我假设我的 2 个本地 git 存储库配置不同,这就是导致问题的原因。 什么会导致这种行为?

我将分享我对这个问题的理解以及我是如何解决这个问题的,感谢对此 post 的有用评论。

问题与 SMB 安装、文件权限和 git 配置有关。问题是当我使用 git 从远程同步到我的本地存储库并且需要在我的本地存储库中由 git 创建一个新文件时,git 正在创建一个新文件使用其默认权限设置 (644) 和 SMB 挂载,本地存储库存在于其下,没有为文件模式配置设置,因此它使用默认设置 (755)。最终结果是 git 认为它正在创建一个具有 644 权限的文件,但一旦创建它就假设了 755 权限,因为这是新文件的安装强制...所以 git 认为它刚刚创建的文件已更改,并将其视为未提交的本地更改文件。这已通过一些更改解决:

  • 更改了 /etc/fstab 中的 SMB 挂载以包含文件模式 (file_mode=0644) 符合 git 想要的
  • 一旦我这样做并 unmounted/remounted 它,我的所有文件 本地回购现在显示为未提交的本地更改,因为 许可 (644) 与我的本地仓库知道的不同,并且 我的 git 设置对此很敏感。我通过检查验证了它 git 设置

git config --get core.fileMode

  • 这已通过更改 git 配置解决 存储库。在本地 repo root 的 .git 文件夹中,我编辑了 配置文件,以便 filemode = false.
  • 一旦我这样做了,git status 显示没有未提交的本地 变化。

这个 git documentation 很好地解释了这是如何发生的,这与发生在我身上的事情非常接近(即在 SMB 挂载之前将远程仓库克隆到本地磁盘上的本地仓库,并且然后最终将本地存储库移动到 SMB 安装)

现在,添加到 GitHub 存储库然后下拉到本地存储库的新文件不再显示为本地未提交的更改。相反,它们被正确且透明地合并。