본문 바로가기
Develop/etc

[Git] 커밋 변경 내역에서 특정 파일/키워드 삭제하기

by 연로그 2022. 3. 31.
반응형

😄 서론

준 덕분에 ✨넥스트스텝의 김민주님, 임성현님의 Git 발표✨를 듣게 되었다.

발표는 실습을 바탕으로 진행되었는데 너무 인상 깊었고 신기했고.. 무엇보다 나중에 쓸 일이 생길 것 같았다.😇

관련 내용을 포스팅해도 되는지 여쭤보고 허락 하에 포스팅 한다.

흔쾌히 허락해주신 민주님, 성현님과 말을 전달해주신 준 모두 감사합니다. 😊

프사는 본인 사진이셔서 가렸어요! 허락 감사합니다 ㅎㅎ

 

 

😨 만약 내가 중요한 정보를 GitHub에 올렸다면...

관리자 계정의 ID, password를 하드코딩해놓고 그대로 GitHub에 올려버렸다면?

데이터베이스의 주소, 비밀번호 등이 다 드러난 설정 파일을 그대로 GitHub에 올려버렸다면???

 

다신 이런 실수를 하지 않겠다는 다짐은 당연하고!!

이미 일어난 일을 어떻게 해결해야 할까?

 

1. https://rtyley.github.io/bfg-repo-cleaner/ 다운로드

  • BFG는 Git 레포지토리 기록에서 잘못된 데이터를 제거하기 위해 만들어짐
  • git filter-branch를 이용할 수도 있지만 위 jar파일 이용이 훨씬 간단

 

2. 제거할 키워드 목록을 담은 txt 파일 생성

  • 제거할 키워드 목록을 담은 텍스트 파일을 생성
  • 각 키워드 목록은 엔터로 구분

 

관리자 id가 'yeonlog', password가 'abcd1234'인 정보를 가리고 싶다면 아래와 같은 txt 파일을 생성한다.

yeonlog
abcd1234

 

3. 터미널에서 jar 실행

$ java -jar <BFG.jar의 경로> --replace-text <2에서 생성한 파일.txt>

 

4. Git에 Push

  •  -f  옵션을 통해 코드 변경 이력을 로컬 저장소의 것으로 덮어씀
$ git push -f <remote명> <branch명>

 

push 후 GitHub에서 커밋 내역을 확인해보면 숨김 처리 된 것을 확인할 수 있다

 

 

🤔 파일 하나를 통째로 숨기고 싶다면?

마찬가지로 BFG jar를 이용하되 터미널에서 실행시킬 명령어만 약간 다르다.

java -jar <BFG.jar의 경로> --delete-files <숨김처리할 파일명>

 

위 명령어를 실행하고 push한 뒤 GitHub 커밋 내역을 보자.

내가 커밋한 내역은 물론 다른 사람이 커밋한 내역까지 숨김 처리한 파일이 보이지 않는다.

커밋 내역은 남아있되 file changed는 조회할 수 없다.

 

 

👨‍💻 중요한 정보는 어떻게 관리하죠?

수습이 끝났다면 이미 한번 GitHub에 업로드 된 비밀번호를 변경해주는 센스도 잊지 말자.

이제 앞으로는 어떻게 관리할지 생각해보자.

 

파일의 커밋을 막기 위해서는 .gitignore를 이용하면 된다.

하지만 어쨌든 개발자들끼리는 주요 정보가 담긴 파일을 공유해야한다.

어떻게 공유할까?

 

❗ 단순하게 관리하기

내가 전에 겪은 방법으로는 두 가지 정도가 있다.

  1. 파일 이메일이나 메신저 등으로 직접 주고받기
  2. 사내 망에서 공유되는 공용 폴더를 만들어 관리

 

일단 두 방법을 겪은 후기를 말해보자면... 둘 다 불편하고 귀찮다. 😅

 

2번은 사내 망에 존재하니 외부에서 접근할 수 없어 최소한의 접근 제어는 가능했지만... 

외부에서 접근이 불가능하기 때문에 파일을 다운 받기위해 반드시 회사 네트워크를 사용해야 했고,

변경 사항이 있을때마다 수동으로 파일 변경해야 했다.

 

❗ 또 다른 방법

민주님과 성현님이 소개해주신 방법이 좀 더 유용하다.

id, password 같은 주요 정보를 저장할 수 있는 서버를 활용하는 방법이다.

 

Vault나 AWS에서 지원하는 Systems Manager Parameter Store같은 것들이 있다.

주요 정보들을 key-value 형태로 저장해두고 필요할 때 꺼내서 사용한다.

 

어떤 것을 사용하냐에 따라 다르겠지만 아래와 같이 간단한 코드를 통해서도 호출할 수 있게 된다.

// 이동욱님 블로그 (https://jojoldu.tistory.com/509)
@Value("${encrypt.key}")
private String encryptKey;

 

자세한 설정 방법이나 사용 방법에 대해서는 생략한다.

이러한 방법이 있다 정도로만 인식해둔다. 😄

반응형