忽略提交给 git 的文件并将它们从历史记录中删除
Ignore files committed to git and also remove them from history
我在开始我的项目时忘记将某些文件添加到我的 .gitignore 中,因此提交了我不应该拥有的文件。 I ignored the files afterwards as described here. 损坏已经发生,因为文件仍然存在于我的存储库的历史记录中,现在我的存储库大小为 10gb!
由于上述原因我没有推送文件,所以重写历史应该没问题。简而言之,我需要做的是重写历史,以便之后 none 当前 .gitignore
中的文件存在于存储库中的任何提交中。
编辑:有很多小文件导致了大文件,所以关于如何删除超过特定大小阈值的所有文件的建议副本并不能解决这个问题。
如果你在推送这些文件后有很多提交,我认为你不会找到一个非常好的解决方案,但是可以删除它们。
假设目前您的最新作品在 dev
分支中。
您可以转到最初跟踪这些文件的提交,并在那里为商品创建一个新分支,比方说 fix_dev
.
我首先会按照您在问题中引用的 SO post 删除此提交中错误跟踪的文件。之后,我将使用以下命令修改该提交:
git commit --amend -m "Original message with additions"
这将创建原始提交的副本,但它会与原始 git 历史记录不同。接下来,我会将 dev
分支的 interactive rebase 提交到 fix_dev
分支,留下原始未修改的提交。
通过这种方式,您应该最终得到一个版本库,而不会在分支 fix_dev
中错误地添加该特定提交的文件。如果您在添加不需要的文件的地方有更多的提交,您可以重复该过程。
一旦您对新分支的版本感到满意,就可以将开发分支移到那里:
git checkout fix_dev
git branch -f dev
git checkout dev
最后,您需要强制将 dev 推送到您的远程存储库以重写历史记录:
git push -f remote dev
如果您担心存储库大小,我建议您执行以下步骤
- Remove files from .gitignore. Now you will have those files back.
- Make a delete commit of all those files
- Again update .gitignore so that those don't get checked in again by anyone
要将提交历史重置为原始,您可以使用git reset --hard origin/branchname
。
要忽略文件并将其从历史记录中删除,您可以遵循以下两个方面:
1。忽略已经提交给 git
的文件
- 通过
touch .gitignore
创建一个 .gitignore
文件(如果你没有)。
- 在
.gitignore
中添加您要忽略的文件和文件夹。允许使用通配符。然后提交更改。
- 忽略已提交历史记录中的文件:
git rm filename -r --cached git commit
2。完全从提交历史中删除文件
git filter-branch --index-filter 'git rm --ignore-unmatch -r --cached filename' --prune-empty -f -- --all
要整理您的本地存储库(您也可以跳过此步骤):
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
git prune --expire now
要将重写历史推送到远程:
git push -f --all
您可以使用交互式变基来做到这一点:-
- 选择您要为其删除文件的最新提交。
- 正常删除它们,.gitignore 然后提交。
- 进行交互式变基,将删除提交移动到您正在修复的提交之后。
- 执行交互式变基以压缩删除及其之前的提交。
- 根据需要重复任何剩余的提交。
我原以为您可以在一个交互式变基中执行 3 和 4,但我发现它导致了冲突。
我在开始我的项目时忘记将某些文件添加到我的 .gitignore 中,因此提交了我不应该拥有的文件。 I ignored the files afterwards as described here. 损坏已经发生,因为文件仍然存在于我的存储库的历史记录中,现在我的存储库大小为 10gb!
由于上述原因我没有推送文件,所以重写历史应该没问题。简而言之,我需要做的是重写历史,以便之后 none 当前 .gitignore
中的文件存在于存储库中的任何提交中。
编辑:有很多小文件导致了大文件,所以关于如何删除超过特定大小阈值的所有文件的建议副本并不能解决这个问题。
如果你在推送这些文件后有很多提交,我认为你不会找到一个非常好的解决方案,但是可以删除它们。
假设目前您的最新作品在 dev
分支中。
您可以转到最初跟踪这些文件的提交,并在那里为商品创建一个新分支,比方说 fix_dev
.
我首先会按照您在问题中引用的 SO post 删除此提交中错误跟踪的文件。之后,我将使用以下命令修改该提交:
git commit --amend -m "Original message with additions"
这将创建原始提交的副本,但它会与原始 git 历史记录不同。接下来,我会将 dev
分支的 interactive rebase 提交到 fix_dev
分支,留下原始未修改的提交。
通过这种方式,您应该最终得到一个版本库,而不会在分支 fix_dev
中错误地添加该特定提交的文件。如果您在添加不需要的文件的地方有更多的提交,您可以重复该过程。
一旦您对新分支的版本感到满意,就可以将开发分支移到那里:
git checkout fix_dev
git branch -f dev
git checkout dev
最后,您需要强制将 dev 推送到您的远程存储库以重写历史记录:
git push -f remote dev
如果您担心存储库大小,我建议您执行以下步骤
- Remove files from .gitignore. Now you will have those files back.
- Make a delete commit of all those files
- Again update .gitignore so that those don't get checked in again by anyone
要将提交历史重置为原始,您可以使用git reset --hard origin/branchname
。
要忽略文件并将其从历史记录中删除,您可以遵循以下两个方面:
1。忽略已经提交给 git
的文件- 通过
touch .gitignore
创建一个.gitignore
文件(如果你没有)。 - 在
.gitignore
中添加您要忽略的文件和文件夹。允许使用通配符。然后提交更改。 - 忽略已提交历史记录中的文件:
git rm filename -r --cached git commit
2。完全从提交历史中删除文件
git filter-branch --index-filter 'git rm --ignore-unmatch -r --cached filename' --prune-empty -f -- --all
要整理您的本地存储库(您也可以跳过此步骤):
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
git prune --expire now
要将重写历史推送到远程:
git push -f --all
您可以使用交互式变基来做到这一点:-
- 选择您要为其删除文件的最新提交。
- 正常删除它们,.gitignore 然后提交。
- 进行交互式变基,将删除提交移动到您正在修复的提交之后。
- 执行交互式变基以压缩删除及其之前的提交。
- 根据需要重复任何剩余的提交。
我原以为您可以在一个交互式变基中执行 3 和 4,但我发现它导致了冲突。