如何从存储库中删除“file1.txt”?


当前回答

在我的案例中,我尝试在几次提交后删除github上的文件,但保存在计算机上

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

后来这个文件被忽略了

其他回答

对于git rm不够,需要从历史中删除文件的情况:正如git filter分支手册页面现在本身建议使用git filter repo,而我今天不得不这样做,这里有一个使用该工具的示例。它使用示例回购https://example/eguser/eg.git

将存储库克隆到新目录gitclone中https://example/eguser/eg.git除了不需要的文件,保留所有内容。git filter repo--path file1.xt--反转路径将远程存储库原点添加回:git远程添加原点https://example/eguser/eg.git.gitfilter repo工具通过设计删除远程远程信息,并建议一个新的远程repo(参见第4点)。这对于大型共享回购来说是有意义的,但对于删除一个新添加的文件来说,可能是过度的,如本例所示。当对本地内容满意时,用它替换远程。git push——强制-u原点主控。由于历史已更改,需要强制。

还请注意,在加载和更改存储库历史记录之前,有关团队和项目动态的链接手册中有一个有用的“干运行”选项和一个很好的讨论。

2022年有效的新答案。

请勿使用:

git filter-branch

推送后,此命令可能不会更改远程回购。如果您在使用它之后进行克隆,您将看到没有任何变化,回购仍然具有较大的大小。此命令已过时。例如,如果使用中的步骤https://github.com/18F/C2/issues/439,这行不通。

你需要使用

git filter-repo

步骤:

(1) 在.git中查找最大的文件:

git rev-list --objects --all | grep -f <(git verify-pack -v  .git/objects/pack/*.idx| sort -k 3 -n | cut -f 1 -d " " | tail -10)

(2) Strat过滤这些大型文件:

 git filter-repo --path-glob '../../src/../..' --invert-paths --force

or

 git filter-repo --path-glob '*.zip' --invert-paths --force

or

 git filter-repo --path-glob '*.a' --invert-paths --force

或无论您在步骤1中找到什么。

(3)

 git remote add origin git@github.com:.../...git

(4)

git push --all --force

git push --tags --force

完成!

转到项目目录并键入:

git filter-branch --tree-filter 'rm -f <deleted-file>' HEAD

在推送之后,强制从所有提交中删除文件。

git push origin --force --all

如果您有GitHub for Windows应用程序,您可以通过5个简单步骤删除文件:

单击同步。单击文件所在的目录,然后选择文件的最新版本。单击工具并选择“在此处打开外壳”在shell中,键入:“rm{filename}”并按enter键。提交更改并重新同步。

如果要从存储库中删除文件,但将其保留在文件系统中(将被取消跟踪):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

如果要从repo和文件系统中删除文件,则有两个选项:

如果文件在索引中没有暂存更改:bykov@gitserver:~/temp>git rm file1.textbykov@gitserver:~/temp>gitcommit-m“删除file1.txt”如果文件在索引中进行了更改:bykov@gitserver:~/temp>git rm-f file1.textbykov@gitserver:~/temp>gitcommit-m“删除file1.txt”