【问题标题】:Why does merging from a particular GitHub repository into a local Git repository result in uncommitted changes in the local repository?为什么从特定的 GitHub 存储库合并到本地 Git 存储库会导致本地存储库中未提交的更改?
【发布时间】:2021-01-12 22:35:31
【问题描述】:

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

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

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

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

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

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

我假设我有 2 个本地 git repos 配置不同,这导致了问题。 什么会导致这种行为?

【问题讨论】:

  • 检查本地 repo 2 是否启用了 CRLF 样式的行尾修改并将 A.jpg 视为文本文件。如果是这样,请确保它将 A.jpg 视为二进制,或者没有打开 CRLF 调整。
  • @Kevin git check-attr --all -- A.jpg 在两个存储库中返回什么?
  • SMB 共享不应引起问题,但值得尝试将其消除。
  • 啊哈!这是您的 SMB 服务器试图补偿 Windows 执行位权限(或缺乏)。这有点奇怪,因为 Linux 具有适当的执行权限,而且我认为有一种有效的翻译方法。有关一些猜测,请参阅unix.stackexchange.com/questions/103415/…
  • 如果不能让SMB服务器和Linux系统配合,可以让Git显式忽略执行权限。事实上,如果服务器始终保持x 位设置,git initgit clone 应该已经这样做了,这表明服务器可以同时支持模式 644 和 755,并且只是错误地创建文件(通过在创建后使用 Linux 系统 chmod,这在 Linux 挂载端可能大部分是可修复的)。在任何情况下,Git 设置都是core.filemode(可以拼写为core.fileMode)。

标签: git github git-merge git-fetch


【解决方案1】:

感谢这篇文章中提供帮助的 cmets,我将分享我对问题的理解以及我是如何解决这个问题的。

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

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

git config --get core.fileMode

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 2011-12-30
    • 2017-05-28
    • 1970-01-01
    • 2010-11-29
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多