Remove sensitive files and their commits from Git history

前端 未结 11 2179
借酒劲吻你
借酒劲吻你 2020-11-21 04:36

I would like to put a Git project on GitHub but it contains certain files with sensitive data (usernames and passwords, like /config/deploy.rb for capistrano).

I kno

11条回答
  •  温柔的废话
    2020-11-21 05:17

    For all practical purposes, the first thing you should be worried about is CHANGING YOUR PASSWORDS! It's not clear from your question whether your git repository is entirely local or whether you have a remote repository elsewhere yet; if it is remote and not secured from others you have a problem. If anyone has cloned that repository before you fix this, they'll have a copy of your passwords on their local machine, and there's no way you can force them to update to your "fixed" version with it gone from history. The only safe thing you can do is change your password to something else everywhere you've used it.


    With that out of the way, here's how to fix it. GitHub answered exactly that question as an FAQ:

    Note for Windows users: use double quotes (") instead of singles in this command

    git filter-branch --index-filter \
    'git update-index --remove PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' ..HEAD
    git push --force --verbose --dry-run
    git push --force
    

    Update 2019:

    This is the current code from the FAQ:

      git filter-branch --force --index-filter \
      "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
      --prune-empty --tag-name-filter cat -- --all
      git push --force --verbose --dry-run
      git push --force
    

    Keep in mind that once you've pushed this code to a remote repository like GitHub and others have cloned that remote repository, you're now in a situation where you're rewriting history. When others try pull down your latest changes after this, they'll get a message indicating that the changes can't be applied because it's not a fast-forward.

    To fix this, they'll have to either delete their existing repository and re-clone it, or follow the instructions under "RECOVERING FROM UPSTREAM REBASE" in the git-rebase manpage.

    Tip: Execute git rebase --interactive


    In the future, if you accidentally commit some changes with sensitive information but you notice before pushing to a remote repository, there are some easier fixes. If you last commit is the one to add the sensitive information, you can simply remove the sensitive information, then run:

    git commit -a --amend
    

    That will amend the previous commit with any new changes you've made, including entire file removals done with a git rm. If the changes are further back in history but still not pushed to a remote repository, you can do an interactive rebase:

    git rebase -i origin/master
    

    That opens an editor with the commits you've made since your last common ancestor with the remote repository. Change "pick" to "edit" on any lines representing a commit with sensitive information, and save and quit. Git will walk through the changes, and leave you at a spot where you can:

    $EDITOR file-to-fix
    git commit -a --amend
    git rebase --continue
    

    For each change with sensitive information. Eventually, you'll end up back on your branch, and you can safely push the new changes.

提交回复
热议问题