BFG를 통해 GiitHub의 제출 내역에서 비밀번호 제거

10456 단어 GitbfgGitHub

개시하다


본고는 GiitHub의 제출 기록에서 비밀번호를 삭제하기 위해 BFG 도구를 사용하는 절차를 소개한다.

구상적 용례

  • 암호를 명문 형식으로 파일에 저장하고 GiitHub에 push한다.
  • 시간이 지나자 명문이 좋지 않은 것을 발견하고 비밀번호는 환경 변수에서 얻은 코드로 바뀌었다.
  • 하지만 과거 제출 역사를 거슬러 올라가면 비밀번호를 볼 수 있다.그래서 이력서 제출에서 비밀번호를 삭제하고 싶어요.
  • 제한 사항


    이 방법은 제출 기록에 있는 비밀번호를 삭제할 수 있지만,pull request 기록 (diff) 에는 비밀번호가 남아 있습니다.
    pull request에서 비밀번호를 삭제하려면GiitHub의 창고를 삭제하거나 GiitHub 지원pull request를 삭제해 달라고 요청해야 합니다.
    참조: Git push has some rejections · Issue #36 · rtyley/bfg-repo-cleaner

    샘플 항목의 구성


    본 글은 다음과 같은 간단한 창고를 샘플로 구상하였다.
    .
    ├── sample.txt
    └── secrets.yml
    
    secrets.yml에서 비밀번호는 원래 명문으로 쓴 것이다.
    secrets.yml
    password: foobar
    secret: barbuz
    
    현재 상황은 다음과 같이 수정되었다.
    secrets.yml
    password: "<%= ENV['PASSWORD'] %>"
    secret: "<%= ENV['SECRET'] %>"
    
    이 밖에 GiitHub에는 실제 창고(비밀번호는 제출 이력에서 삭제)가 준비되어 있다.

    절차.


    BFG 설치


    BFG가 설치되지 않은 경우 BFG를 설치합니다.
    Homebrew를 사용하여 설치하려면 다음 절차를 따르십시오.
    $ brew update
    $ brew install bfg
    $ bfg --version
    bfg 1.12.15
    
    또한git버전은 2.12.2에서 동작 확인을 진행하였다.
    $ git --version
    git version 2.12.2
    

    로컬 시스템에서 개발 중인 코드를 모두 GiitHub에 push


    만약 로컬 기기에 아직 push가 개발되지 않은 코드가 있다면,GiitHub로 push하십시오.
    로컬 기기에 놓아도 괜찮지만 이력서 제출에 변화가 생겨 로컬 기기에pull &merge를 넣으면 시간이 좀 걸립니다.
    여러 개발자가 있다면 다른 개발자에게도 알려주세요.

    GiitHub의 pull request를 merge 또는 close 상태로 설정


    불필요한 번거로움을 피하기 위해서, GiitHub에 Open pull request가 남아 있다면, 통합하거나 close를 사용하십시오.

    모든 분기의 HEAD에 명문 암호가 없는지 확인


    GiitHub에 여러 개의 지점이 있는 경우 모든 지점의 HEAD(즉 최신 코드)에 명문된 비밀번호가 없음을 확인한다(이번에는 환경 변수에서 얻은 것이다).
    암호가 남아 있는 경우 BFG를 실행할 때 다음 정보가 표시되며 대상 파일의 제출 내역은 변경되지 않습니다.
    Protected commits
    -----------------
    
    These are your protected commits, and so their contents will NOT be altered:
    
     * commit 922243a1 (protected by 'HEAD') - contains 1 dirty file : 
        - secrets.yml (22 B)
    
    WARNING: The dirty content above may be removed from other commits, but as
    the *protected* commits still use it, it will STILL exist in your repository.
    
    비밀번호가 있으면 분기를 삭제하고 최신 버전의 코드를 통합하십시오. (명문 비밀번호를 사용하지 않는 코드) HEAD에 비밀번호를 남기지 마십시오.

    -- mirror 옵션을 추가하고 다시 clone 웨어하우스


    새 창고를 로컬 기기에서 현재 개발된 디렉터리 이외의 위치에 두십시오.--mirror 옵션이 추가됩니다.
    다음은 작업용 디렉터리입니다. 클론이 있는 예입니다.
    $ mkdir work
    $ cd work
    $ git clone --mirror [email protected]:JunichiIto/bfg-sandbox.git
    

    passwords.txt에 삭제할 비밀번호 저장


    passwords.txt라는 파일을 만들고 삭제할 비밀번호를 기록합니다.
    passwords.txt
    foobar
    barbuz
    
    work 디렉터리의 구성은 다음과 같다.
    work/
    ├── bfg-sandbox.git/
    └── passwords.txt
    
    그리고 패스워드.txt는 다른 몇 가지 지정 방법이 있습니다.
    참조: BFG Repo-Cleaner --replace-text example
    PASSWORD1                       # Replace literal string 'PASSWORD1' with '***REMOVED***' (default)
    PASSWORD2==>examplePass         # replace with 'examplePass' instead
    PASSWORD3==>                    # replace with the empty string
    regex:password=\w+==>password=  # Replace, using a regex
    regex:\r(\n)==>$1               # Replace Windows newlines with Unix newlines
    

    BFG 실행


    다음 명령을 사용하여 BFG를 실행합니다.
    $ bfg --replace-text passwords.txt bfg-sandbox.git 
    
    이 명령을 실행하면 터미널에 다음과 같은 내용이 표시됩니다.
    Using repo : /Users/jit/dev/sandbox/work/bfg-sandbox.git
    
    Found 3 objects to protect
    Found 6 commit-pointing refs : HEAD, refs/heads/bob-feature, refs/heads/develop, ...
    
    Protected commits
    -----------------
    
    These are your protected commits, and so their contents will NOT be altered:
    
     * commit fd0f3ec7 (protected by 'HEAD')
    
    Cleaning
    --------
    
    Found 9 commits
    Cleaning commits:       100% (9/9)
    Cleaning commits completed in 55 ms.
    
    Updating 5 Refs
    ---------------
    
        Ref                      Before     After   
        --------------------------------------------
        refs/heads/bob-feature | ef2cd1af | 9664245c
        refs/heads/develop     | 1eb3d80b | ba3c5ab8
        refs/heads/master      | fd0f3ec7 | 147f4942
        refs/pull/1/head       | 6b269cae | 7a38c8e2
        refs/pull/2/head       | 1eb3d80b | ba3c5ab8
    
    Updating references:    100% (5/5)
    ...Ref update completed in 19 ms.
    
    Commit Tree-Dirt History
    ------------------------
    
        Earliest      Latest
        |                  |
         D D D D D  m m m m 
    
        D = dirty commits (file tree fixed)
        m = modified commits (commit message or parents changed)
        . = clean commits (no changes to file tree)
    
                                Before     After   
        -------------------------------------------
        First modified commit | e9df6ca3 | 2cebd96f
        Last dirty commit     | a47e91e4 | 15ab3de5
    
    Changed files
    -------------
    
        Filename      Before & After                          
        ------------------------------------------------------
        secrets.yml | 0d217b89 ⇒ 9460a9cb, 6cb378ce ⇒ 2a248e70
    
    
    In total, 13 object ids were changed. Full details are logged here:
    
        /Users/jit/dev/sandbox/work/bfg-sandbox.git.bfg-report/2017-04-27/05-36-48
    
    BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
    
    
    --
    You can rewrite history in Git - don't let Trump do it for real!
    Trump's administration has lied consistently, to make people give up on ever
    being told the truth. Don't give up: https://www.theguardian.com/us-news/trump-administration
    --
    
    터미널 출력의 "Proted commiits"열에 주의하십시오.
    Protected commits
    -----------------
    
    These are your protected commits, and so their contents will NOT be altered:
    
     * commit fd0f3ec7 (protected by 'HEAD')
    
    여기에 "sample.yml"이 없으면 제출 기록에서 비밀번호를 삭제할 수 있습니다.

    GuitHub에서 push


    다음 절차에 따라 변경된 이력서를 GiitHub에 push합니다.
    $ cd bfg-sandbox.git
    
    $ git reflog expire --expire=now --all && git gc --prune=now --aggressive
    Counting objects: 21, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (16/16), done.
    Writing objects: 100% (21/21), done.
    Total 21 (delta 2), reused 6 (delta 0)
    
    $ git push
    Counting objects: 21, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (14/14), done.
    Writing objects: 100% (21/21), 2.19 KiB | 0 bytes/s, done.
    Total 21 (delta 2), reused 21 (delta 2)
    remote: Resolving deltas: 100% (2/2), done.
    To github.com:JunichiIto/bfg-sandbox.git
     + ef2cd1a...9664245 bob-feature -> bob-feature (forced update)
     + 1eb3d80...ba3c5ab develop -> develop (forced update)
     + fd0f3ec...147f494 master -> master (forced update)
     ! [remote rejected] refs/pull/1/head -> refs/pull/1/head (deny updating a hidden ref)
     ! [remote rejected] refs/pull/2/head -> refs/pull/2/head (deny updating a hidden ref)
    error: failed to push some refs to '[email protected]:JunichiIto/bfg-sandbox.git'
    
    git push 이후 ! [remote rejected]error: failed to push some refs 같은 문구를 볼 수 있는데 예상과 같다.
    제한 사항에서 설명한 바와 같이pull request의 역사는 변경할 수 없기 때문에 이러한 정보를 표시합니다.

    GiitHub의 제출 이력서에서 비밀번호가 사라졌는지 확인


    이력서 제출을 확인하려면 GiitHub을 방문하십시오.
    비밀번호가 ***REMOVED***면 성공입니다.
    https://github.com/JunichiIto/bfg-sandbox/commit/7a38c8e217e30b718804b1a8bfa92cfa72f26200

    단, 제한 사항에서 말한 바와 같이,pull request의 역사 기록에는 비밀번호가 보존됩니다.
    https://github.com/JunichiIto/bfg-sandbox/pull/2/files

    개발용 창고 재git clone


    제출 이력이 새로 작성됐기 때문에 원래 개발용 창고git pull로 돌아가면 fatal: refusing to merge unrelated histories 메시지가 나오는데 정상적으로 풀리지 않을 것 같다.
    $ git pull
    remote: Counting objects: 20, done.
    remote: Compressing objects: 100% (13/13), done.
    remote: Total 20 (delta 2), reused 19 (delta 2), pack-reused 0
    Unpacking objects: 100% (20/20), done.
    From github.com:JunichiIto/bfg-sandbox
     * branch            develop    -> FETCH_HEAD
     + 1eb3d80...6da4d6f develop    -> origin/develop  (forced update)
    fatal: refusing to merge unrelated histories
    
    git merge --allow-unrelated-histories origin/develop이렇게 되면 강제합병도 가능하지만 새로운 합병 약속이 있을 수 있으니 다시 clone을 하는 것이 좋다.
    # 旧開発用リポジトリをリネーム
    $ mv bfg-sandbox bfg-sandbox.old
    
    # 改めてclone
    $ git clone [email protected]:JunichiIto/bfg-sandbox.git
    
    여러 개발자가 있다면 다른 개발자에게도 다시 git clone을 알려주세요.
    이상은 절차입니다.

    참고 자료


    GiitHub의 공식 페이지로 창고에서 공개하지 않으려는 데이터를 삭제하는 방법을 설명한다.
    BFG를 사용하지 않고 수동으로 데이터를 삭제하는 방법도 있다.
    Removing sensitive data from a repository - User Documentation
    BFG의 공식 페이지입니다.
    일하기 전에도 먼저 훑어보세요.
    BFG Repo-Cleaner by rtyley

    좋은 웹페이지 즐겨찾기