Git push不会忽略.gitignore中的文件

时间:2014-01-07 08:09:19

标签: git github

我提交了一些我不应该提交的文件。 然后我在.gitignore中添加了这些文件,我这样做了:

git rm -r --cached somefile

我再次承诺。

git status显示:

# On branch experiment
nothing to commit, working directory clean

我做git ls-files并且未列出这些文件。

但是当我执行git push origin somebranch时,这些文件仍然被推送(它们太大而无法推送到github,所以它失败了。)

这是为什么?我该怎么办?

3 个答案:

答案 0 :(得分:5)

文件仍在您的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个文件影响文件添加到存储库,do not affect files already in the index。这就是向.gitignore添加文件对“问题”没有影响的原因。

答案 1 :(得分:1)

如果您已提交该文件。 您可以使用以下方法取消最新的提交:

git reset --soft HEAD^

然后:

git reset filename

然后将文件添加到.gitignore:

或:

git update-index --assume-unchanged  filename

答案 2 :(得分:0)

这里的解决方案可以使用,但是您将在同一提交中丢失其他更改。如果您不想丢失同一提交中的其他更改,并且尚未推送该提交,则必须将HEAD更改回先前的提交,添加更改的文件并进行修改:

首先找到您想返回的提交:

$ git log --oneline

然后,需要签出另一个分支,因为您不能在活动分支中更改HEAD:

$ git checkout master

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

$ git branch -f <branch_name> <commit_id>

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

$ git add <filename>

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

$ git commit --amend --no-edit

该多步骤解决方案为我解决了不丢失更改并将新更改添加到先前提交的问题。