Git push命令不忽略.gitignore文件中的文件

7

我提交了一些不应该提交的文件。 然后我将这些文件添加到了.gitignore中,做法如下:

git rm -r --cached somefile

我又进行了一次提交。

git status 显示:

# 在分支 experiment
无文件要提交,工作目录干净

我运行 git ls-files 命令,但这些文件没有列出来。

但是当我运行git push origin somebranch时,这些文件仍然被推送(它们太大而无法推送到GitHub,因此失败)。

为什么会这样?我该怎么做?


请提供 git status 命令的输出。:) - atupal
4个回答

11

这些文件仍然存在于你的git历史记录中。从问题描述中看,git历史记录示例为:

$ git log --oneline
aaaaaaa Update .gitignore and remove big files
bbbbbbb accidentally add big files to repo
ccccccc update foo
ddddddd update bar

由于推送提交 bbbbbbb 的内容,推送失败,但是如果文件不在当前已检出的版本中,也就是在项目历史记录中,这并不重要。

可以通过检查特定文件/路径的历史记录来确认上述情况:

$ git log --all --format=%H -- big.file
aaaaaaa Update .gitignore and remove big files
bbbbbbb accidentally add big files to repo

如果big.file太大,无法推送到github,则需要将提交列表清空。

从历史记录中彻底删除文件

有许多方法可以防止尝试将big.file推送到远程仓库,但基于问题中的信息,最简单的方法是:

$ git reset --hard ccccccc

这将删除提交记录 aaaaaaabbbbbbb,因此不会尝试将 big.file 推送到远程仓库。

.gitignore 的目的

.gitignore 文件影响将文件添加到代码库中,它们不会影响已经在索引中的文件。这就是为什么将文件添加到 .gitignore 中对 '问题' 没有产生影响的原因。


如果在提交 aaaaaa 和 bbbbbb 中进行了其他更改,而您希望保留这些更改,有没有一种方法可以通过手术方式删除有问题的 big.file 文件,而不会破坏您的提交历史记录? - Ethan Fischer
我相信你想要的是 git rm --cached myUnwantedFile - medley56
@medley56 那样会将文件保留在历史记录中。Ethan git rebase,编辑提交 aaaaaa 和 bbbbbb - 这方面已经有许多现有问题(也有很多我已经回答过的)。 - AD7six

2

如果您已经提交了文件,您可以使用以下命令取消最新的提交:

git reset --soft HEAD^

然后:
git reset filename

然后将文件添加到.gitignore中:

或者:

git update-index --assume-unchanged  filename

0
这里提供的解决方案可以解决问题,但是您将会失去同一次提交中的其他更改。如果您不想失去同一次提交中的其他更改,并且您还没有推送该提交,那么您必须将 HEAD 改回到以前的提交,添加更改的文件并进行修改:
首先找到您想要返回的提交:
$ git log --oneline

接下来,需要检出另一个分支,因为您不能更改活动分支中的HEAD:

$ git checkout master

然后,将分支的头更改为旧的提交:

$ git branch -f <branch_name> <commit_id>

然后,将修改后的文件添加到当前提交中:

$ git add <filename>

然后,将更改修改为当前提交:

$ git commit --amend --no-edit

那个多步骤的解决方案对我来说很有效,可以避免丢失更改并将新更改添加到先前的提交中。


0
另一个选项是按照@AD7six的答案,创建一个没有历史记录的新分支,这样你就可以将此分支推送到远程服务器,完全忽略大文件。
你可以通过以下方式实现:
git checkout --orphan <name_you_choose_for_orphan_branch>
git commit

然后使用以下命令推送您的更改:

git push <remote-name> <name_you_choose_for_orphan_branch>

来源:如何清除所有历史记录并推送它


1
基本上只是重复了 https://dev59.com/zWcs5IYBdhLWcg3w1XXZ#34954852 上的内容。这应该是一个包含链接的评论,而不是答案。 - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接