1
fds 2016-12-01 11:09:01 +08:00
你怎么 rm 的?把 commit 从历史版本里删掉了么?没有的话用 git reset --hard 回到以前,然后 git push --force 强制覆盖。
|
2
lrh3321 2016-12-01 11:10:20 +08:00
都已经被提交过了就无解了
除非你先 checkout 到 commit 之前 然后, 把最新分支的内容覆盖一次 接着,重新提交 再 -f 推送到服务器 |
3
song4 2016-12-01 11:13:03 +08:00
一旦文件添加进去,就一直在里面了,直接 rm 是没办法把这个文件从历史提交里面移除的。
你需要的是把文件从整个历史里面抹掉: git filter-branch --index-filter \ 'git rm --cached --ignore-unmatch path/to/your/file' \ --tag-name-filter cat -- --all |
7
Citrus 2016-12-01 11:23:02 +08:00 2
先说方法,你需要这个简单的小工具:
https://rtyley.github.io/bfg-repo-cleaner/ 然后说原理: 因为 Git 会记录你 所有 的历史提交,所以为了回滚需要,只要是在 Git 中存在过一次的文件,就会被永久记录下来,不论当前是否存在。 |
9
TangMonk 2016-12-01 11:31:18 +08:00
git rm --cached test
|
10
chousb 2016-12-01 11:34:41 +08:00
|
11
fan123199 2016-12-01 11:42:25 +08:00
@song4 git filter-branch --index-filter \
'git rm --cached --ignore-unmatch path/to/your/file' \ --tag-name-filter cat -- --all 这个方法学习了,但是不知道对其他成员有没有影响(比如他 pull 或 push 时出错。)。 git 官方说, 修改 public repo 的已有 commit , 会有大影响。 |
12
song4 2016-12-01 11:44:45 +08:00
|
13
fan123199 2016-12-01 11:45:32 +08:00
@bonfy 这不是新手问题,如果你的 test 变动还在 HEAD ,那么很简单,按 1L 办,如果又加了新 commit ,那就难办了,所以要认真对待每个 commit ,特别是 push 的时候。
|
14
song4 2016-12-01 11:47:27 +08:00
另外,分享一篇文章, Github 官方帮助告诉你怎样从仓库里彻底移除敏感信息: https://help.github.com/articles/remove-sensitive-data/
|
15
fan123199 2016-12-01 11:51:41 +08:00
@song4 这个时候,是不是跟 filter 有关的 commit 的 hash 值都会变成新的。如果是的话,感觉是重做了整个 branch 的感觉。这个在公有 repo 还是太危险,行不通。 最好只在本地完成。
|
16
song4 2016-12-01 11:56:24 +08:00
|
17
laiqs2011 2016-12-01 12:51:17 +08:00
git gc 试试?
|
21
fivesmallq 2016-12-01 18:07:40 +08:00
之前遇到过 ,可以参考下 http://nll.im/post/clean-up-git-repo.html
|
22
bonfy OP 谢谢各位,我最后还是 git reset , git push --force 重新提交解决的
核弹级选项: filter-branch 估计也是正解,但是看着就吓人,没勇气尝试。。。 |
23
Sunnyyoung 2016-12-01 23:45:08 +08:00
## 命令
`git filter-branch --tree-filter 'rm -rf test/' --tag-name-filter cat HEAD --all` ## 说明 `--all` : 所有分支 `--tree-filter`: 需要执行的命令 `--tag-name-filter cat` : Tag 也做修改 |
24
DravenJohnson 2016-12-02 05:57:56 +08:00
需要 Clean 历史 Commit ,后晌几个说的都可以
|