使用gitignore清理Git存储库

时间:2015-05-20 19:08:26

标签: git gitignore

所以我在bitbucket上有这个两岁的C#回购。直到昨天它还没有.gitignore - 我知道,迟到了。

这是一个个人项目。

我可以使用.gitignore作为基础来清理回购。那么工人会有效地删除.gitignore所说不应该存在的任何内容吗?

3 个答案:

答案 0 :(得分:5)

  

注意:首先,您更好地对git存储库进行备份,因为它总是会出错(完全行为git的{​​{1}}可以取决于所有类型的设置/ ...所以它不能完全预测过程的结果是什么,所以最好是安全而不是抱歉)。 将目录复制到其他位置就足够了:该目录中有一个(隐藏的).git目录,其中包含历史记录,标记等。

仅限最后一次提交

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

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上找到)必须要小心,因为我听说运行 Windows <的文件系统上的白/黑名单之间存在差异/ em>的

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

答案 1 :(得分:2)

我认为你想要的是:https://stackoverflow.com/a/1139797/3025093

要取消已经添加/初始化到存储库单个文件,请停止跟踪该文件,但不要将其从系统中删除:{{ 1}}

要取消现在位于git rm --cached filename中的每个文件:

首先提交任何未完成的代码更改,然后运行以下命令:

.gitignore

这将从索引(暂存区域)中删除所有已更改的文件,然后运行:

git rm -r --cached .

承诺:

git add .

答案 2 :(得分:0)

您需要在本地克隆项目(如果您还没有),然后手动删除文件或文件夹(不再存在文件或文件夹,即gitignore文件中提到的文件或文件夹)和然后提交那些删除。然后你可以把它推到你的远程仓库。