git clone 커밋 히스토리없이 가볍게 클론하기

terminal
1
git clone --depth 1 https://github.com/chinsun9/refactor-2019T1.git
  • git clone을 통해 클론하게되면 .git 폴더도 같이 딸려온다
  • .git 폴더없이 최신 상태만 가져오고싶을 때 어떻게 할까 찾아보다가
  • --depth 옵션을 알게되었다
  • --depth 1 하게되면 가장 마지막 상태만 클론하게된다

참고

github 저장소 복제

1
2
3
4
5
6
7
git clone --bare -b docker --single-branch  https://github.com/chinsun9/2020-web-test.git

cd 2020-web-test.git
git push --mirror https://github.com/chinsun9/2020-web-test-mirror.git

cd ..
rmdir /s 2020-web-test.git
  • 우선 터미널에서 작업하기 전에 새로운 깃허브 저장소를 하나 생성한다.(복제될 저장소)
  • 2020-web-test의 docker 브랜치를 bare clone 한다

  • bare clone하게되면 소스코드가 보이지않고 이런 요상한 파일들이 보인다
  • 평범히 클론했다면 .git 디렉터리에 있는 내용들이다
  • cd 2020-web-test.git로 들어가주고
  • git push --mirror https://github.com/chinsun9/2020-web-test-mirror.git
  • 새로운 저장소로 mirror옵션을 주고 푸쉬하게되면 커밋내역까지 똑같이 저장소가 복제된다

  • 오른쪽이 복제한 저장소이고, 복제한 저장소에서 하나의 커밋을 하였다
  • rmdir /s 2020-web-test.git 이제 이 쓸모없는 디렉터리는 삭제하고
  • 복제한 저장소를 git clone https://github.com/chinsun9/2020-web-test-mirror.git 클론해서 사용하면된다

용도?

  • 퍼블릭 저장소에 올렸던 프로젝트를 계속 이어하는데
  • dbconfig파일이나, 보여주고싶지않은 정보가 있을 수 있다
  • 처음에는 비공개 브랜치? 이런 키워드로 찾아봤었는데, 그런 기능은 없었다
  • 프로젝트를 통째로 복사해서 새롭게 git init 하는 방법도 있는데,
  • 이 방법을 통해서 커밋내역을 유지하면서 복제할 수 있었다

참고

github api로 특정 저장소의 커밋내역 불러오기

  • 깃허브 api로 특정 저장소 커밋내역 json으로 받아보기
  • 나는 내 special repository인 chinsun9 저장소의 커밋내역을 받아와보았다

github api

https://api.github.com/repos/chinsun9/chinsun9/commits
https://api.github.com/repos/{유저명}/{저장소명}/commits

  • js에서는 fetch api로 데이터를 가져와 원하는 로직을 수행하면 될 것 같다
  • github api가 있다는 것을 알아보았고, 맛보기를 해보았다
  • 비공개 저장소 접근이나 다른 유용한 api가 있는지 알아보고 활용하면 좋을 것 같다

깃허브 자기 닉네임 저장소 special repository

  • https://github.com/chinsun9 자기 깃허브 메인화면에 가장 처음 표시되는 readme파일의 저장소다!
  • 내가 어떤 개발자인지 보여주는 용도이다
  • GitHub Readme Stats를 통해 자기 깃허브 활동을 시각적으로 보여주면 더 좋다!

special repository

  • github에서 저장소명을 자신의 닉네임이랑 똑같이 하면 special repository 라는 것이 만들어진다
  • 이 special repository는 내 깃허브 메인 화면에서 가장 처음으로 보여지는데,
  • 여기서 내 프로필을 적어서 나를 자랑?할 수 있다

GitHub Readme Stats

chinsung/chinsung

특정 브랜치 클론하기

1
2
3
git clone -b {브랜치명} --single-branch {저장소}

git clone -b docker --single-branch https://github.com/chinsun9/2020-web-test.git
  • 저장소에 여러 브랜치가 있는데, 특정 하나의 브랜치만 클론하고 싶을때!

git clone -b docker –single-branch https://github.com/chinsun9/2020-web-test.git

git push -f

1
git push -f

git push -f

  • -f, --force옵션은 푸쉬하는데 원격 저장소를 아예 덮어쓰는 옵션이다
  • 따라서 이미 원격 저장소에 올렸는데 커밋을 수정한 경우에 사용할 수 있다

바로 직전 커밋 취소

1
2
3
4
5
git reset --soft "HEAD^"

또는

git reset --soft HEAD~1
  • 이렇게하면 파일 상태는 그대로 이며 직전 커밋내역만 없어진다
  • 나는 빠진 파일을 추가하거나 커밋 메시지를 다시 작성할 때 쓴다

more?

.gitignore 써서 커밋 가볍게 하기

  • 깔끔하게 코드 공유하기, 숨겨야하는 파일 숨기기!

따라하기

준비물

  • 깃허브 데스크탑
  • 이클립스 (java IDE)

샘플 자바 프로젝트 만들기

  • 이런 구조의 자바 프로젝트가 있다
    .
    ├── .settings
    │ └── org.eclipse.jdt.core.prefs
    ├── bin
    │ ├── HelloWorld.class
    │ └── Tmp.class
    ├── src
    │ ├── HelloWorld.java
    │ └── Tmp.java
    ├── .gitignore
    ├── .classpath
    └── .project

  • .java 파일은 컴파일 과정을 통해 .class 파일이 된다

  • 코드를 공유할때 java파일만 있어도 충분히 공유 받은 사람이 컴파일해서 사용할 수 있다

  • .class 파일은 공유할 필요가 없는 것이다

  • .gitignore 파일이 빈파일이라고 하면 총 8개의 파일이 트랙된다

.gitignore에 *.class추가하기

.gitignore
1
*.class
  • .gitignore 에 위 내용을 추가하면
  • 이렇게 .class 파일이 빠지고 6개 파일만 트랙된다
  • 이렇게해서 내 로컬에는 남아있지만 깃에서는 무시된다

깃허브 데스크탑에서 gitignore 파일 추가하기

  • Tmp.java는 내가 혼자 막 테스트하느라 임시로 생성한 파일이라고 해보자
  • 다른사람이 봐도 아무 의미가 없는 파일이라면 .gitignore에 추가해준다
  • 깃허브 데스크탑에서 우클릭으로 무시 목록에 추가해보았다
  • 그러면 이렇게 자동으로 .gitignore이 업데이트 된다
  • 이렇게 Tmp.java가 무시되어 5개만 트랙되는 모습니다

  • 이런식으로 특정 파일을 골라서 무시할 수 있다

  • 이제 init이라는 커밋 하나를 해보겠다

이미 커밋한 파일 gitignore하기

  • HelloWolrd.java를 수정했다.
  • 근데 HelloWolrd.java도 .gitignore에 추가해야할 거 같아서 Tmp.java와 같은 방법으로 무시하기를 했는데…
  • .gitignore에 분명이 추가되었지만 여전히 트랙되고있다…
  • 이미 한번 커밋된적이 있는 파일들을 새로이 .gitignore에 추가했을때 생기는 문제다
  • 이럴 때는 터미널에 git rm -r --cached .명령을 통해 캐시를 삭제하고..
cmd
1
git rm -r --cached .
  • 깃허브 데스크탑으로 돌아와보면 이렇게 제외되있는걸 확인할 수 있다
  • 초록색 + 표시는 무시해도된다. 이미 커밋되었지만 캐시가 삭제되서 다시 나타난 거다

여기까지 커밋 내역

  • 이렇게 하나씩 수동으로 무시할 파일을 지정하는 방법이 있지만
  • 프로젝트 구조가 비슷하기 때문에 사람들이 미리 정의해둔 .gitignore을 쓰면 편리하다
  • 깃허브 데스크탑에서 로컬 저장소를 생성할때 gitignore을 설정하는데 그렇게 쓰는 방법도 있고,