.gitignore工作错误,签出分支时文件消失



我对.gitignore感到有点困惑。事情是这样的,我在Rails中开发,我不想把secrets.ymldatabase.yml上传到Github中。

我认为我只需要在AWS EC2上编辑这两个文件,所以我把它们添加到.gitignore

然后我运行

git rm --cached secrets.yml database.yml

清理git轨道文件状态

因此,这两个文件仍在文件夹中,但无法添加到git track list中。

然而,我发现当我checkout其他branch,然后回来。这两个文件会消失,发生了什么?

Git为每个分支单独存储这些文件。因此,您可以在许多分支上拥有具有不同内容的相同文件。您也可以在一个分支上拥有文件,并将它们从另一个分支中删除(这可能是您当前拥有的)。

如果你已经把你的文件推送到Github, 的秘密已经公开,应该尽快改变。不要只是删除文件,你永远不能确定没有人复制它们!

正如评论中提到的,您可以将文件filter-branch取出并强制推出存储库,但是如果有其他人已经签出了存储库,那么这会破坏一些东西。我宁愿使用git rm --cached从所有分支中删除该文件,并推动分支以保持稳定的历史记录并更改秘密。

你可以自动从所有分支中删除文件:

for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
    git checkout "$branch"
    git rm --cached config/secrets.yml config/database.yml
    git commit -m 'Remove secrets.yml'
done
echo "Remember to git push"

如果你还没有推出分支,你可以过滤掉文件(取自这个答案):

git filter-branch --index-filter 'git rm --cached --ignore-unmatch config/secrets.yml config/database.yml' --all

Filter分支工作得很好,但是非常不直观,并且在规模上很慢。也就是很多的提交。

GitHub推荐:https://rtyley.github.io/bfg-repo-cleaner/

最新更新