我对.gitignore
感到有点困惑。事情是这样的,我在Rails
中开发,我不想把secrets.yml
和database.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/