Git推送不会忽略.gitignore中的文件

gojuced7  于 2022-11-27  发布在  Git
关注(0)|答案(4)|浏览(174)

我提交了一些不应该提交的文件。然后我将这些文件添加到.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,所以失败了)。
这是为什么?我该怎么办?

fivyi3re

fivyi3re1#

这些文件仍然在你的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的内容而导致推送失败,无论文件是否在当前 checkout 的版本中 * 它都在项目历史记录中 *。
也可以通过检查特定文件/路径的历史记录来确认上述情况:

$ 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对“问题”没有影响的原因。

c86crjj0

c86crjj02#

如果您已提交文件。您可以使用以下命令取消最后一次提交:

git reset --soft HEAD^

然后道:

git reset filename

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

git update-index --assume-unchanged  filename
wpx232ag

wpx232ag3#

这里的解决方案是可行的,但是你会丢失同一次提交中的其他修改。如果你不想丢失同一次提交中的其他修改,并且你还没有推送提交,你必须将HEAD改回之前的提交,添加修改后的文件并修改:
首先找到要返回的提交:

$ git log --oneline

然后,需要 checkout 另一个分支,因为您无法更改活动分支中的HEAD:

$ git checkout master

然后,将分支的头部更改为一个较旧的提交:

$ git branch -f <branch_name> <commit_id>

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

$ git add <filename>

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

$ git commit --amend --no-edit

这个多步骤的解决方案使我不会丢失更改,也不会向以前的提交添加新的更改。

aelbi1ox

aelbi1ox4#

@AD7six回答后的另一个选项是创建一个没有历史记录的新分支,这样您就可以将此分支推送到远程服务器,完全忽略大文件。
您可以通过执行以下操作来完成此操作:

git checkout --orphan <name_you_choose_for_orphan_branch>
git commit

然后使用

git push <remote-name> <name_you_choose_for_orphan_branch>

来源:How can I purge all the history and push it

相关问题