Git:在以前的提交中删除旧模式 100644 新模式 100755

Posted

技术标签:

【中文标题】Git:在以前的提交中删除旧模式 100644 新模式 100755【英文标题】:Git: Remove old mode 100644 new mode 100755 on previous commits 【发布时间】:2021-12-07 08:01:17 【问题描述】:

我正在研究旧 android 手机的内核。我导入了制造商的更改并将它们拆分为提交。 但是,完成该过程后,我意识到有很多文件显示为已编辑,但这是唯一已编辑的权限。 结果,在 git 日志上,它显示如下内容:

diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h
old mode 100644
new mode 100755

我搜索了互联网,发现我可以通过这样做来解决这个问题

git config core.filemode false

然而,这似乎只在未来提交时才会改变。

如何编辑我之前的所有提交(几乎是 70 多个提交)并删除记录为正在编辑的这些文件?

谢谢。

【问题讨论】:

【参考方案1】:

你不能。旧的(现有的)提交是一成不变的。

一般而言,您永远不必更改 core.filemode,因为 Git 应该正确设置它。因此,在任何 Windows 系统上,它已经为您设置为 false。看起来您,或者至少是某个人,以某种方式设法获得了错误的设置,从而产生了这些不正确的提交。

无法修复不正确的提交,但如果它们足够困扰您,您可以进行新的、非常不同的提交。这些新的、略有不同的提交应该在所有方面都与旧提交完全匹配,除了一个:新提交中记录的文件 modes 将匹配其父提交中记录的文件模式,因此当每个修改后的快照与其父快照进行比较时,修改后的快照完全没有区别。1

从脚注 1 可以明显看出,做这项工作的缺点是您必须修改许多提交,而现在您有一个新的和不同的存储库,可以替换那些 70 多个旧提交。您现在必须让拥有此 Git 存储库克隆的每个人 切换到另一个新克隆,其中 70 多个 (固定)提交替换了 70 个旧的(略不正确)提交。

忍受现有的错误通常更简单——而且相当无害。


1请记住,每个 Git 提交都包含一个每个文件的完整快照,包括文件的模式。你遇到的问题是,在某个时候,有人告诉 Git——也许是通过这个不知何故不正确的 core.filemode 设置——所有 new 提交都应该将文件记录为模式 100755 (rwxr-xr-x ) 而不是模式 100644 (rw-r--r--)。从 100644 到 100755 的第一次提交会产生差异。从那时起,每个显示100755new 提交都不会产生差异,因为模式不会改变。

一旦你做出一个更正的提交,其中更新的文件都是mode 100644,但是,更正的提交与其父级相比很好,但与随后的未更正 提交。因此,您现在必须进行 another 新提交,与后续提交相同,但模式已更正。 每个新提交都会重复此操作。

最终结果是您必须将所有 70 多个提交加倍:现在您有 140 多个提交。然后,您只需停止使用“错误”的,而改用“正确”的。

【讨论】:

听起来他们可能没有在本地以外的任何地方提交它们,而且没有其他人在使用这些提交,所以他们可能想要并且会从重新生成他们的工作中受益! @ti7:这是“通常更容易接受它”规则的一大例外。不幸的是,也没有现成的工具来做这件事。可能有一种方法可以使用旧的过滤器分支脚本来设置适当的git filter-branch 您好,首先,没有人真正使用我的作品是对的,因为它现在不在互联网上,只有在本地。 (不过要有备份。)我所有的工作都是在 Debian 系统中完成的,所以问题是手机制造商似乎也在 Windows 系统上的内核上工作。 当我在这个内核上合并一个较新的 CodeAurora 标签时,我得到了 300 多个合并冲突,其中许多发生在这些文件中。这些文件中没有任何编辑,但 git 历史显示它们好像被我在第一篇文章中所说的那样进行了编辑,并且在那里发生了冲突。 (或者我对 git mergetool 的工作原理理解错误?) 文件模式在 Linux 文件系统上正常工作(除非你挂载 Windows 文件系统),所以在 debian 上工作时,你通常不会有任何core.filemode 问题。但简单地进行修复提交(更改文件模式)应该可以让您解决任何 file-mode-related 合并问题(如果这是一个问题——它似乎不应该是;Git应该结合这些就好了)。我希望看到的问题是有人在 Windows 上完成工作并放入 CRLF 行结尾。

以上是关于Git:在以前的提交中删除旧模式 100644 新模式 100755的主要内容,如果未能解决你的问题,请参考以下文章

text 如何从Git中的非分段更改中删除说“旧模式100755新模式100644”的文件?

git教程:删除文件

在 android studio 中删除旧的并添加新的 git

git基础教程 从版本库删除文件

git revert与git reset

彻底清除git所有历史提交记录使其为“新”库