git - 使用 gitignore 清理 Git 存储库

标签 git gitignore

所以我在 bitbucket 上有这个已有两年历史的 C# 存储库。直到昨天它才具有 .gitignore - 我知道,晚了。

这是一个个人项目。

我可以使用 .gitignore 作为基础清理 repo 吗?所以工作人员会有效地删除 .gitignore 说不应该存在的任何东西?

最佳答案

Notice: First of all you better take a backup of your git repository, since it always can go wrong badly (the exact behavior of git can depend on all kinds of settings/... so it is not completely predictable what the result of the process will be, so better be safe than sorry). It is sufficient to copy the directory to some other location: there is a (hidden) .git directory in that directory containing the history, tags, etc.

仅最后一次提交

如果您只想删除新提交的内容,那么您不关心存储在文件系统历史记录中的文件,您可以删除它们:

git rm --cached -r .
git add .

rm --cached -r . 表示您将从 git 存储库中删除所有内容,但将文件保留在文件系统中。您以递归方式执行此操作,因此所有文件都不再是存储库的一部分。接下来,您再次将所有文件添加到存储库中,但是 .gitignore 文件将不会重新添加那些应该被忽略的文件。

所有提交(整个历史)

如果您想从所有以前的提交中删除这些文件,我建议使用 bash 脚本。它可能不是最有效的。

现在我们可以做的是列出所有应该至少被忽略一次的文件:

git ls-files --exclude-standard --others --directory --ignored

我会首先检查列表 并检查是否没有应该保留 的文件。相应地更新 .gitignore,只有当这些文件都不再出现时才转到下一步。

如果列表中没有更多文件要保留在存储库中,则可以运行此脚本:

#!/bin/bash
for f in `git ls-files --exclude-standard --others --directory --ignored`
do
    git filter-branch --force --index-filter "git rm --cached --ignore-unmatch '$f'" --prune-empty --tag-name-filter cat -- --all
done

该脚本在历史记录中至少迭代一次要忽略的文件,并通过所有提交执行文件过滤。请注意,这些文件不会从您的文件系统中删除。但是您将丢失这些文件的历史记录

此外,对于标准的 .gitignore(例如可以在 GitHub 上找到),必须要小心一些,因为我听说在运行 < em>Windows。

一些提交可能会消失,因为这些提交的唯一区别涉及不再是存储库一部分的文件。例如,如果您忽略 *.log 文件并且日志包含日期;可能只有 file.log 文件被修改了。如果您删除该文件,则修改该文件的提交也将被删除。

关于git - 使用 gitignore 清理 Git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30358374/

相关文章:

git - 自定义 git diff 以忽略一些冲突

git - 备份 git 服务器以进行灾难管理阶段

git - 使用 JGit 将 git 存储库克隆到 InMemoryRepository

git - 如何使用 Git ignore file 来防止将 vendor 文件夹和其他 laravel 的配置文件上传到 git 分支。什么是正确的方法?

javascript - 是否应该将 package-lock.json 文件添加到 .gitignore 中?

git - 如何获取git存储库中特定文件的更改历史记录

windows - 如何将 Git for Windows 软件安装到特定目录?

Git:忽略子模块中未跟踪的文件

git - 忽略 stable 中的文件夹,但不在 devel 分支中

git - 如何使用 Git 忽略除某些文件/目录之外的所有文件/目录?