从较早的提交中删除文件,而不影响gitlab中的任何其他提交

时间:2019-08-13 08:03:09

标签: git gitlab

我正在使用gitlab存储库上传我的代码文件。我已经提交了500多次。我的仓库最大为540 mb。我想通过删除仓库中不需要的文件来最小化仓库的大小。

我以某种方式管理和删除了本地文件。现在,我当前的本地文件大小为10 mb。我推了它,这很好。即使显示540mb。我知道以前的提交文件保存了该存储。我的较早提交中有一个大小为400 mb的zip文件。

我通过使用Shell脚本找到了提交。我想删除提交中的zip文件。但是它在gitlab webui中显示了"You can only delete files when you are on the branch"。在终端中,我找到了命令git rm <file_name>来删除文件。我从提交中得到了文件路径。但是我不知道如何在特定的提交上使用它。它包含一些重要文件。我不想玩。

我的问题是:如何在gitlab的特定提交中删除某个文件而不影响任何其他提交?我尝试了Stack Overflow,并发现了一些答案,可以在先前的提交中删除文件,但在较早的提交中却没有。为我提供一些解决方案。

3 个答案:

答案 0 :(得分:2)

简短的回答是严峻的:你不能。

也就是说,您过去可以 修改提交,但是它将修改行中的每个提交,因此不会检查“不影响任何其他提交”部分。

看看git filter-branch,了解一下可以使用哪些工具来更改历史记录,但是请注意,这是一项繁重的操作。

答案 1 :(得分:2)

在不影响提交历史记录的情况下,无法删除文件。

要删除历史记录中的文件,可以使用git内置的git-filter-branch或第三方bfg-repo-cleaner

请参阅i-want-to-remove-a-large-file-from-ever-existing-in-repo-history中的Github: git-flight-rules

recommended-technique-use-third-party-bfg

(master)$ git rm path/to/filetoremove
(master)$ git commit -m "Commit removing filetoremove"
(master)$ java -jar ~/Downloads/bfg.jar --delete-files filetoremove

built-in-technique-use-git-filter-branch

(master)$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch filepattern' --prune-empty --tag-name-filter cat -- --all

答案 2 :(得分:1)

有一个名为BFG Repo-Cleaner的命令行实用程序,可以帮助您做到这一点。

例如,此命令将遍历存储库的历史记录,并删除可从任何分支访问的所有提交中的特定文件:

bfg --delete-files big-400-MB-file.zip path/to/your/repo

您可以使用git filter-branch命令和一些Shell脚本来实现相同的目的,但这要容易得多。

现在,关于问题的第二部分:

  

......不影响任何其他提交

那根本不可能。从较早的提交 中删除文件将导致其SHA-1发生更改,这又将更改所有后代提交的SHA-1。换句话说,您就是rewriting a large chunk of history,根据您的特定情况,这可能是问题也可能不是问题:

  

该命令为filter-branch,它可以重写您的历史记录,因此除非您的项目尚未公开并且其他人尚未根据您的提交进行工作,否则您可能不应该使用它将要重写。