BFG를 통해 GiitHub의 제출 내역에서 비밀번호 제거
개시하다
본고는 GiitHub의 제출 기록에서 비밀번호를 삭제하기 위해 BFG 도구를 사용하는 절차를 소개한다.
구상적 용례
제한 사항
이 방법은 제출 기록에 있는 비밀번호를 삭제할 수 있지만,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
Reference
이 문제에 관하여(BFG를 통해 GiitHub의 제출 내역에서 비밀번호 제거), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jnchito/items/64ffb76a9c645323f43c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)