어제 일이 있어 늦게나마 백준 문제를 풀고나서 커밋을 해야하는데 깜빡하고 커밋을 하지 않았고, 결국 12시가 넘어 commit이 되지 않아 내 잔디밭에 또 하나의 구멍이 뚫렸다. 하ㅜㅜ
부디 다른 사람들은 이런 불상사가 생기는 일 없으면 좋겠다
![]()
커밋을 깜빡해 잔디밭에 구멍 뚫린게 한두번이 아니다. 공부를 하거나 프로젝트를 하면서도 종종 커밋을 잊어버릴 때가 있어 1일1커밋을 지키지 못하는 경우가 있다. 그래서 새벽 내내 커밋을 자동화 하는 방법을 알아보았다.
하지만 내가 생각하던 완전한 자동화는 결국 구현하지 못하였고 프로그램을 실행시키는 방법으로는 2가지 방법을 알아내고, 구현을 해보았다. 그 방법을 정리하고자 한다.
제일 쉽게 구현 가능하면서 제일 편하게 자동 커밋을 할 수 있는 방법이다.
먼저 깃허브에 리포지토리를 생성하고 로컬 리포지토리와 연결하자.(여기서는 리포지토리를 연결하는 방법까지 다루지는 않을 것이다. 벌써 아침 9시야ㅜ)
그리고 로컬에서 해당 폴더(또는 프로젝트)로 이동하면 .git폴더가 생성되어 있는 것을 확인할 수 있는데, 이러면 준비는 끝났다.
이제 메모장을 열어 아래의 코드를 입력해주자.
:: git init
:: git remote add origin https://github.com/qkrmekem/algorithm.git
:: git add --all
:: git commit -m "before reupload"
:: git pull --rebase origin main
:: git push --set-upstream origin main
:loop
cd D:\My Java\algorithm
git add --all
git commit -m "auto commit"
git pull
git push
TIMEOUT 300
goto loop
주석처리된 부분은 처음 한번 실행할 때만 쓰인다.
git pull --rebase origin main
git 저장소에서 pull을 함과 동시에 로컬브랜치의 시작지점을 Git저장소의 최신 지점으로 설정
git push --set-upstream origin main
push를 할 git저장소와 브랜치를 설정, 이렇게 설정해두면 다음에 push할때 따로 저장소와 브랜치를 명시해주지 않아도 됨


clone으로 저장소를 가져온 경우에는 아래의 코드만 입력해도 된다.
:loop
cd folder path
git init
git pull
git add --all
git commit -m "auto commit"
git push
:: 5분 대기
TIMEOUT 300
goto loop
개인적으로 이게 제일 구현하기도 쉽고 사용하기도 편하지만, 뭔가 자바를 이용해서 자동커밋을 구현해 보고 싶었고, jGit을 이용해 자동 커밋을 구현해보았다.
jGit은 이클립스에서 제공하는 오픈 소스 라이브러리로 git 저장소에 쉽게 접근하고 작업을 수행할 수 있는 다양한 기능을 제공한다.
원래는 순수한 자바 환경에서 구현해보고 싶었지만 이 경우에는 자료가 너무 없어서 시간상 spring boot를 이용해 구현해보았다. start.spring.io에서 깡통 프로젝트를 만들어 jGit 의존성만 주입해주면 되니 크게 걱정하지 않아도 된다. 라이브러리는 아래 링크를 이용하자.
jGit링크(Maven Respotitory)
이제 jGit까지 준비되었다고 생각하고 본격적으로 기능을 구현해보자.
public class AutoPushTest {
public static void main(String[] args) throws IOException, GitAPIException {
// 깃 사용자 정보를 담은 객체
// 이름이 Test라 헷갈릴 수 있는데
// 구현을 해보는 단계라 임시로 이렇게 지었다.
UserTest userTest = new UserTest();
// 로컬 리포지토리와 온라인 리포지토리를 연결하는 코드
// 여기에는 로컬 리포지토리 경로를 넣어주자
try (Git git = Git.open(new File("your folder path"))) {
RemoteAddCommand remoteAddCommand = git.remoteAdd();
remoteAddCommand.setName("origin");
try {
// 여기에는 온라인 리포지토리 경로를 넣어주자
remoteAddCommand.setUri(new
URIish("your repository link"));
System.out.println("file Added");
} catch (URISyntaxException e) {
e.printStackTrace();
}
// git add .의 역할
git.add().addFilepattern(".").call();
remoteAddCommand.call();
// git commit -M "auto-commit" 역할
git.commit().setMessage( "auto-commit" ).call();
try {
// push origin main 역할
git.push()
.setCredentialsProvider(new UsernamePasswordCredentialsProvider(userTest.getUsername(), userTest.getPassword()))
.setRemote("origin").add("main").call();
} catch (TransportException e) {
System.out.println(e.toString());
}
}
}
}
stackoverflow에 올라온 자료와 댓글 등등을 조합해서 만들었다.
여기서
UsernamePasswordCredentialsProvider(userTest.getUsername(), userTest.getPassword()))
이 부분 때문에 시간이 제일 오래걸렸는데, stackoverflow에는 UsernamePasswordCredentialsProvider(깃 username, 깃 password)가 담아져 있는 것처럼 코드가 작성되어 있는데 accesstoken을 넣어줘야 한다.
발급받기에 앞서 accesstoken은 암호와 같은 역할을 하므로 사용할 때 노출되지 않도록 주의하고 또 주의하자!!!
깃허브에 로그인을 해주자.
아래 사이드바에서 settings로 ㄱㄱ

아래로 좀 내려보면 Developer settings로 이동하자

Tokens(class)을 클릭!

Generate new token을 클릭하자
Note 부분에는 어디에 사용하는지 사용처를 적어주자
이제 권한 설정을 해야하는데, 깃허브 공식문서에는 repo만 체크하라고 한다.
나는 이것도 모르고 다른 것도 체크했는데...
Generate token을 클릭하자
그럼 아래와 같은 화면이 뜨는데 빨간색 박스부분을 클릭하면 accesstoken을 복사할 수 있다!!!

앞서 말했다시피 accesstoken은 노출되어서는 안되는 정보이다. 때문에 깃허브에 push하는 과정에서 이런 민감한 자료도 올라가지 않게 조심해야 하는데, 이를 피할 수 있는 2가지 방법만 알아보자.
.properties 파일 활용하기
spring을 사용하면 @Value를 이용해 properties에 있는 데이터를 활용할 수 있다. 따라서 .gitignore에 properties파일을 등록하고 실제 코드에서는 @Value를 이용해 값을 주입받아 사용하자.
properties의 데이터를 활용하는 방법은 properties값 활용하기 를 참고하자
클래스 생성하기
위의 코드에서 사용한 방법인데, 깃허브 username과 accesstoken을 담는 클래스 하나를 생성하자.
그리고 마찬가지로 .gitignore에 해당 클래스 파일이 올라가지 않도록 등록해주고, 이 클래스의 객체를 생성하여 값을 담아준다.
당연히 필드는 private으로 하고 setter는 생성하지 않고 getter만 생성해서 사용하자.
어찌 됐든 이렇게 구현하고 메서드를 실행한 결과


메서드를 실행하면 자동으로 설정한 path안에 있는 파일을 깃허브에 commit 및 push를 진행하는 것을 확인할 수 있다!!!!
갑자기 새벽에 자동 커밋을 구현해 보겠다고 삽질도 많이 하고 이런 저런 방법으로 시도를 하다보니 시간이 엄청 오래걸렸다. 이제 빨리 씻고 자야지.
마지막으로 코드를 구현하는데 도움을 받았던 고마운 자료들이다.
스택오버플로우 stackoverflow
참고자료
배치 파일