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

问题描述

我有2个GitHub存储库,我们将它们称为 GH1 GH2 ,以及2个相应的本地存储库,我们将它们称为 LR1 LR2 ,将它们作为遥控器。为了清楚起见,这是本地存储库到远程存储库的映射:
LR1 ---> GH1
LR2 ---> GH2

我使用GitHub Web UI手动将同一文件(称为 A.jpg 上传(并提交)到两个GitHub存储库中。 当我尝试从遥控器合并回本地存储库时,会得到不同的结果。

出于此问题,我在命令行上使用git。

一个本地存储库( LR1 )的行为与我期望的一样: step从远程获取更改,但不合并。 num合并 A.jpg 快速转发本地存储库。 git fetch显示“没有任何内容可以进行,工作目录很干净”

一个 LR2 )的行为与我期望的不同: git merge从远程获取更改,但不合并。 git status合并 A.jpg 快速转发本地存储库。 git fetch显示 A.jpg 修改,并且是未提交的更改。

对于2个本地存储库,

git merge的行为方式相同,但是为了解决此问题,我想我会明确调用2个命令(git status和{{ 1}})的功能与拉动功能相同。

我假设我以不同的方式配置了2个本地git仓库,这就是问题所在。 什么会导致这种行为?

解决方法

感谢这篇文章的有用评论,我将分享我对该问题的理解以及解决方法。

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

  • 更改了/ etc / fstab中的SMB挂载以包括文件模式 (file_mode=0644)符合git的需求
  • 执行完此操作并卸载/重新安装后,我所有的文件 本地回购现在显示为未提交的本地更改,因为 权限(644)与我的本地存储区知道的不同,并且 我的git设置对此很敏感。我通过检查 git设置

git config --get core.fileMode

  • 这已通过更改git的配置来解决 资料库。在本地存储库根目录的.git文件夹中,我编辑了 配置文件,以使filemode = false
  • 完成此操作后,git status会显示没有未提交的本地 变化。

此git documentation很好地说明了这是怎么发生的,这与我所经历的非常接近(即,在将SMB挂载之前,将远程回购克隆到本地磁盘上的本地回购中,然后最终将其移动到本地到SMB挂载)

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