【问题标题】:git push trying to push files not listed in git ls-filesgit push 试图推送 git ls-files 中未列出的文件
【发布时间】:2015-12-09 10:03:59
【问题描述】:

我不小心在我的 repo 中提交了一个不必要的大子文件夹 xxxxx,当我在推送时意识到这一点时,我在中途停止了推送。

然后我从 repo 中删除了一个不必要的文件夹 xxxxx,使用

git rm -r --cached xxxxx

但是,虽然ls-files 没有显示 xxxxx 文件夹,但当我显示git push 时,git 仍在尝试推送它:

git push --verbose
(...)

Counting objects: 19, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (18/18), done.
POST git-receive-pack (chunked) 
Writing objects: 100% (19/19), 132.93 MiB | 197.00 KiB/s, done.
Total 19 (delta 5), reused 0 (delta 0)
remote: warning: File xxxxx/a.csv is 72.22 MB; this is larger than GitHub Enterprise's recommended maximum file size of 50.00 MB
remote: error: GH001: Large files detected.
remote: error: File xxxxx/b is 112.37 MB; this exceeds GitHub Enterprise's file size limit of 100.00 MB

如何让 git 永久忘记 "xxxxx" 文件夹及其内容?

【问题讨论】:

  • 这些文件的提交是最新的吗?
  • 是的。但是这个提交还包括一些我不想恢复的有效更改。

标签: git github


【解决方案1】:

git push 不推送文件,它推送提交。具体来说,它会推送您拥有而他们没有的提交(无论“他们”是谁 - 您正在推送的遥控器)。他们抱怨您的至少一个提交包含至少一个大文件。

您需要推送一些不同的提交,以便您推送的提交不包含大文件。

作为一般规则,这样做的方法是完整保存每个“好”提交,将其复制到一个新分支,并且对于每个“坏”提交,提取好的部分,删除坏的部分,然后结果中的新提交。例如,假设这是远程提交的绘图:

A <- B <- C <- D    <-- origin/master

假设你添加了三个提交,但中间有一个问题:

A - B - C - D       <-- origin/master
             \
              E - F - G   <-- master

当您运行 git push 时,您的 git 会发送提交 E、F 和 G,而远程会抱怨,因为 F 有文件,它不应该。要解决这个问题,您可以简单地将E 复制到一个新分支——我们将复制E'——然后复制但修复F 以生成F',然后复制G 以生成G' .让我们也重命名旧的(“坏”)master;事实上,让我们完全去掉这个名字,这样我们就有了这个:

              E' - F' - G'   <-- master
             /
A - B - C - D       <-- origin/master
             \
              E - F - G      [abandoned]

执行此复制的 git 命令是 git rebase。通常它只是直接复制;您希望它改为复制E,然后停下来让您修复F,然后复制G,实现它的方法是使用-i 或--interactive 标志。

一般来说,你应该只在更改时复制只有你拥有的提交,但幸运的是,这正是git push应该推送的集合,以及你推送的任何分支, origin/<em>branch</em>(或任何远程名称,如果不是origin)将界定远程拥有(和其他人拥有)的提交。

交互式 rebase 可以做的远不止这些,请参阅 the Git Book 获取说明。您还可以确定哪些提交包含哪些大文件;为此,git show 和 git diff 是有用的工具。

【讨论】:

  • 非常有趣,我为教育内容本身投了赞成票。现在我是否能够使用它来解决我的烂摊子,我会在几个小时内看到我有机会尝试它。如果我这样做,我会选择答案。谢谢!
  • 顺便说一句,如果“坏”提交位于分支的顶端,您可以直接使用 git commit --amend(如 Pro Git 书中所述:git add 和/或 git rm 首先,然后git commit --amend) 没有交互式变基部分。它做同样的事情 - 制作原始提交的副本,然后“放弃”原始提交以支持副本,它仅限于一个最尖端的提交,而 rebase 可以在链中进一步返回。
  • 再次感谢您。这帮助很大,我在这个过程中学到了很多东西。
【解决方案2】:

由于需要编辑的提交位于分支的头部,因此您可能只需修改它就可以逃脱。 git rm &lt;what you need&gt; 和 git commit --amend 也是如此

这会将更改合并到最近的提交中,而不是创建新的提交

【讨论】:

    【解决方案3】:

    你为什么不试着把这个文件夹放在git的gitignore文件中。

    【讨论】:

    • 我试过了,没有帮助 - 文件夹现在列在 .gitignore 中,git 仍在尝试将其推送到远程。
    • 您确定要忽略的文件夹的文件指定正确吗?
    • 我把整个文件夹指定为:xxxxx/
    猜你喜欢
    • 2020-08-06
    • 2020-01-03
    • 2021-06-19
    • 2020-09-06
    • 1970-01-01
    • 2014-04-30
    • 2016-08-13
    • 2019-06-13
    • 2021-12-19
    相关资源
    最近更新 更多