본문으로 건너뛰기

"git" 태그로 연결된 10개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

Git 고수들은 CLI 만 사용한다지만 난 Rebase 와 Squash 를 하다보면 몇 개의 문서를 다시 열어보는지 모르겠다.

그래서 공식 GUI Clients에서 무료 Git 클라이언트를 파해쳐봤다.

21세기 디자인이면서 커밋 그래프가 제공되고 git flow가 가능하며 쉬운 rebase 가 지원되는 클라이언트는 git krakengit fork 였다.

나머진 다음과 같은 단점이 있었다.

  • SourceTree
    • 윈도우즈에서 UI 가 너무 후지다.
    • 인증이 왜 이렇게 어려운지 모르겠다.
    • 느리다.
  • Github Desktop
    • 딱 깃헙용이다.
    • 되는 기능이 많지 않다.
    • 커밋 그래프도 없다.
  • Tortoise Git
    • 왠지 SVN이 떠올라서 패스했다.
  • Git Extensions
    • 21세기 디자인은 아닌 것 같다.
  • GitEye
    • 솔직히 Git Clients 의 끝인 듯 싶다.
    • 하지만 워크벤치 쓰는 듯한 느낌이라 직관적이진 않다.
  • gitg
    • 너무 간단하다.
  • ungit
    • 너무 간단하다.
  • git-cola
    • cli를 옮겨놓은 느낌이다.
  • Cyeligent Git Tool
    • free 인데 라이센스를 물어본다.
    • 설치 폴더를 설정할 수 없다.
  • Aurees
    • 좋아보였으나 바이러스가 감염됨으로 다운로드 불가능하다.
  • CodeReview
    • diff 용이다.
  • gmaster
    • non-commercial use 이고,
    • 그래프가 너무 느리게 그려진다.
  • GitAhead
    • 좋아보이지만 non-commercial use
  • Guitar
    • diff 용
  • RepoZ
    • 애드온 같은 느낌이다.

Git Kraken

  • 느렸는데 최근 빨라졌다.
  • 근데 아직도 느리다. 일렉트론 기반이라 그런 것 같다.
  • 예쁜 그래프가 있다.
  • 쉬운 rebase 를 제공한다.
  • git flow 가능하다.
  • 검은색 테마가 가능하다.
  • non-commercial use 라 회사에서 못 쓴다.

Git Fork

  • 빠르고 직관적이다.
  • 그래프가 지원된다.
  • 쉬운 rebase 가 가능하다.
  • 검은 테마가 가능하다.
  • 완전한 무료이다.
  • 지속적인 버전 업데이트가 되고 있다.
  • 구글에서 git fork를 검색하면 정말 fork 하는 방법만 나오고 검색이 되지 않는다.

결론

GitFork 를 쓰자. 첫 실행 시에 git config 설정 UI 가 뜨는데 제대로 입력해줘야한다.

그리고 workspace 를 설정하는 란엔 사용하는 workspace 만을 등록하자. 전체를 등록할 경우 모든 폴더의 .git 디렉토리를 읽어오는 것 같다.

· 약 2분

블로그에 붙힐만한 댓글 라이브러리로는 Disqus, Commento, livere 등이 있지만 깃헙 페이지라 Gitment를 사용하고 싶었다.

사전 준비

Github > Settings > Developer settings > OAuth Apps 메뉴로 들어가 새로운 OAuth App 을 만들어준다.

준비

Client ID 와 Client Secret 을 저장해 놓고 Authorization callback URL 은 Homepage URL 과 같은 주소를 입력한다.

# Application name
GracefulLight

# Homepage URL
https://gracefullight.github.io

# Application description
GracefulLights Blog

# Authorization callback URL
https://gracefullight.github.io

소스 추가

원하는 페이지에 소스를 추가한다.

<script src="https://cdn.jsdelivr.net/npm/[email protected]/js/browser/bluebird.core.min.js"></script>
<section class="comments" id="comments">
<div id="gitment_thread"></div>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/[email protected]/style/default.css"
/>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gitment.browser.js"></script>
<script>
var gitment = new Gitment({
id: "Gitment 를 구분할 아이디 (ex: 페이지 제목 또는 포스팅 일시)",
owner: "github 아이디 (ex: gracefullight)",
repo: "repository 명 (ex: gracefullight.github.io)",
oauth: {
client_id: "위에서 발급 받은 client_id",
client_secret: "위에서 발급 받은 client_secret",
},
});
gitment.render("gitment_thread");
</script>
</section>

gitment.min.js 파일은 없으므로, 직접 minify 해서 사용하면 된다. bluebird (promise) core 를 추가한 이유는, IE 에서 gitment 를 지원해야하기 때문이다.

옵션 관리

위 4개 옵션 외에 추가로 옵션을 더 줄 수 있다. desc 와 labels 정도가 추가되면 좋을 것 같다.

댓글 쓰기

깃허브 아이디로 로그인한 뒤 Initialize Comments 를 누르고 댓글을 작성하면 된다.

· 약 2분

이게 뭐죠

커맨드로 명령어를 실행하다보면 생각보다 오타를 많이 치게 된다 tab tab 자동완성 기능과 Oh-My-Zsh 의 syntax highlighting 기능을 사용한다면 충분히 커버가 가능할 것 같지만 현실은 그렇지 않다.

# git checkout master를 치고 싶었으나..
$ git checktou master
git: 'checktou' is not a git command. See 'git --help'.

The most similar command is
checkout

thefuck 을 활용하면 오타가 나 분노한 나의 마음을 표출할 수 있다.

예제

설치

다들 python 3.6 버전 정도는 갖고 있다고 가정한다.

$ pip install thefuck

alias 설정

fuck 만 쳐도 thefuck 의 기능을 사용하기 위해 alias 설정을 해주자.

git bash

bash_profile 에 아래처럼 추가해준다.

vi ~/.bash_profile

eval "$(thefuck --alias)"

환경 변수 설정

  1. Win+R > sysdm.cpl
  2. 고급 > 환경 변수 > 시스템 변수 > 새로만들기 에서 PYTHONIOENCODING 값을 utf-8로 준다.
  3. 확인 ✔️ X 3

powershell

ps 를 주로 사용한다면 설치 후 $PROFILE 파일에 값을 넣어주면 된다.

PS > Notepad $PROFILE

$env:PYTHONIOENCODING="utf-8"
iex "$(thefuck --alias)"

profile 파일이 없다고 오류가 발생하면, 아래 명령어로 profile 파일을 만들어주자.

PS > New-item -type file -force $PROFILE

활용하기

$ git checkuot master
git: 'checkuot' is not a git command. See 'git --help'.

The most similar command is
checkout

$ fuck
git checkout master [enter/↑/↓/ctrl+c]
Already on 'master'
Your branch is up to date with 'origin/master'.

오타 걱정 없이 쉘 커맨드를 실행할 수 있게 되었다.

· 약 1분

바이너리 파일은 diff 가 안 되서 확인을 할 수가 없는데, merge 시에 내 바이너리를 쓸 지 받은 것의 바이너리를 쓸 지 여부를 지정해주면 된다.

# 받아온 브랜치의 바이너리 파일을 사용
$ git merge -X theirs origin/브랜치

# 내 로컬 바이너리 파일을 사용
$ git merge -X ours origin/브랜치

gc 해제

이렇게 받다보면 unlink of file failed 란 오류가 발생할 수가 있는데, git 가비지 컬렉터 옵션을 해당 프로젝트에서만 꺼주면 된다. 기능에는 아무 문제 없다. 궁금하면 git help gc를 해보시길..

# gc 기능 끄기
$ git config --local gc.auto 0

· 약 5분

AWS 에서 제공하는 Cloud Git Repository 인 CodeCommit 으로 소스코드를 관리해보자.

공식 문서가 아주 잘 되어있다. 문서를 보고 시작해도 된다.

IAM 유저 생성

IAM 에서 유저를 만든 뒤에 AWSCodeCommitFullAccess 권한을 추가한다.

키 파일 업로드

ssh 키를 생성하고 Public Key 파일(id_rsa.pub)을 해당 유저의 Security credentials 메뉴에서 업로드한다. 키가 등록되면 SSH key ID가 보이는데 메모해 놓자.

config

사용할 유저의 ssh config 를 설정해줘야한다. User 에 들어가는 값은 위에서 적어놓은 SSH key ID 값이다.

$ vi ~/.ssh/config

# 아래 내용을 맨 위에 넣어주자.
Host git-codecommit.*.amazonaws.com
User EXAMPLEEXAMPLEEXAMPLE
IdentityFile ~/.ssh/id_rsa

# 저장한 뒤 권한을 바꿔준다.
chmod 600 ~/.ssh/config

테스트

설정이 완료된 후에 서울리젼으로 ssh 연결을 시도해보자.

$ ssh git-codecommit.ap-northeast-2.amazonaws.com

# 다음과 같은 메세지가 리턴되면 성공이다.
You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.Connection to git-codecommit.
ap-northeast-2.amazonaws.com closed by remote host.
Connection to git-codecommit.ap-northeast-2.amazonaws.com closed.

연동

이제 AWS CodeCommit 과 내 소스를 연결시켜보자.

# 이미 존재하는 프로젝트의 경우
$ git remote remove origin
$ git remote add origin ssh://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/레파지토리명

# 처음 시작하는 경우
$ git clone ssh://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/레파지토리명

# 권한이 없거나 ssh 계정을 물어볼 때
# origin의 path 앞에 SSH key ID를 추가하자
$ git remote add origin ssh://EXAMPLEEXAMPLEEXAMPLE@git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/레파지토리명

git pull origin master시에 정상적으로 가져오는 걸 확인할 수 있다.

ssh 연동이 잘 되지 않을시

메뉴얼대로 따라해도 연동이 안될 때는 당황하지 말고 IAM > Users > Security credentials에서 HTTPS Git credentials for AWS CodeCommit를 만들어주고 CodeCommit Repository 연결을 http로 하면 된다.

Webhook

Github, Bitbucket 와 달리 Webhook 설정하는 법이 조금은 복잡하다. (GCP 의 Pub/Sub 와 비슷한 느낌)

CodeDeploy 서비스를 사용하면 쉬워질 것 같은데, 그럼 CodePipeline 도 쓰고 싶을 것 같고 CI 세팅을 해야되고 다음 기회에

Lambda

람다는 웹(URL)으로 호출할 수 있는 Javascript function 이다.

설정

먼저 Lambda > 함수 > 함수생성 > 새로 작성 메뉴에서 webhook 이란 이름의 함수를 생성한다. 트리거 구성 메뉴에서 CodeCommit 을 선택하고 입력 폼을 잘 채워주자.

image from hexo

기존 브랜치로 푸시, master 브랜치를 선택했다. 사용자 지정데이터에는 webhook 을 걸 URL 경로를 넣어준다. (예: https://yourdomain.com/webhook)

소스

이미 세팅된 함수를 사용하자.

"use strict";

const url = require("url");
const https = require("https");

exports.handler = (event, context, callback) => {
let webhook_url = event.Records[0].customData;

if (!webhook_url) {
let error = new Error("Web-hook URL not provided as custom data.");
callback(error);
} else {
console.log("POST web-hook to " + webhook_url);
let options = url.parse(webhook_url);
options["method"] = "POST";

const req = https.request(options, (res) => {
let body = "";
console.log("Status:", res.statusCode);
console.log("Headers:", JSON.stringify(res.headers));
res.setEncoding("utf8");
res.on("data", (chunk) => (body += chunk));
res.on("end", () => {
console.log("Successfully triggered web-hook.");
// If we know it's JSON, parse it.
if (res.headers["content-type"] === "application/json") {
body = JSON.parse(body);
}
callback(null, body);
});
});

req.on("error", callback);
req.end();
}
};

https 커넥션이 아닌 경우 http 모듈을 사용해서 request 를 보내면 될 것 같다.

등록 후엔 CodeCommit > 트리거 > webhook > 트리거 테스트를 진행하면 정상적으로 호출이 된다.

로그

호출 로그는 CloudWatch > 로그에서 생성한 Lambda 명으로 확인할 수 있다.

로그 스트림이 설정되지 않았을 경우엔 Lambda > 구성 > 기존 역할에 표시된 역할(Rule)이 해당 Lambda 함수를 잡고 있는지 확인해야한다. IAM > Rules > 해당 룰 > Permissions에서 Show policy를 누르면 Resource 속성에서 확인할 수 있고 다르다면 제대로 연결시켜주면 된다.

여담

AWS Korea week in review에 소개되었다.

· 약 1분

Git 사용을 위해 ssh key 생성해 서버에 추가했는데도 비밀번호를 물어보는 경우가 있다.

윈도우에서 ~/.ssh 경로를 인식하지 못해 발생한다.

해결

시스템 > 고급 시스템 설정 > 환경변수 메뉴로 들어가 HOME 변수로 %HOMEDRIVE%%HOMEPATH% 값을 추가 후 재부팅해주면 된다. image from hexo

· 약 1분

패키지 설치

Package Control을 열어 Terminal 패키지를 설치한다.

Git Bash 와의 연동

Preferences > Package Settings > Terminal > Settings - User 메뉴에서 터미널 경로를 수정한다.

{
// git-bash가 설치된 경로
"terminal": "C:\\Program Files\\Git\\git-bash.exe",
"parameters": []
}

단축키 추가

기본 단축키는 ctrl+shift+alt+t 라 어려우니 변경해주자. Preferences > Key Bindings 메뉴에서 단축키를 추가한다.

{ "keys": ["ctrl+alt+t"], "command": "open_terminal_project_folder" }

이제 ctrl+alt+t 키로 현재 프로젝트에서 깃 배쉬창을 바로 띄울 수 있다.

· 약 2분

Git 은 설치되어 있고, 프로젝트를 clone 했다고 가정합니다.

프로젝트에서 git bash 실행

서버 repository 의 최종 버전을 다운로드

$ git pull origin master

오늘 작업 브랜치 설정 또는 선택

# 작업 브랜치 설정
$ git checkout -b 브랜치명
# 작업 브랜치 선택
$ git checkout 브랜치명

즐거운 코딩

console.log("코딩!!!");

브랜치 작업내역 저장 및 커밋

$ git add .
$ git commit -m '커밋 메세지 (필수)'
# 또는 한방에 커밋
$ git commit -am '커밋 메세지'

master 브랜치로 이동

$ git checkout master

작업한 브랜치 병합 후 테스트

$ git merge 브랜치명

서버 repository 변경점 다운로드

$ git pull origin master

서버 repository 변경점 업로드

$ git push origin master

작업 브랜치 제거

$ git branch -D 브랜치명

기타 자주쓰는 명령어

# 모든 브랜치 확인
$ git branch
# 원격 브랜치 확인
$ git branch -r
# master 브랜치에서 변경된 파일만 보기
$ git diff --name-status master
# 현재 브랜치 변경된 파일 정보 보기
$ git status
# 커밋 로그 한줄 보기
$ git log --pretty=oneline

· 약 3분

서버에서 실행

# 서버에 로그인 후 원하는 위치에서 폴더를 만든다.
$ mkdir [이름].git

# 해당 폴더로 이동한다.
$ cd [이름].git

# Git 원격 저장소를 초기화한다.
$ git init --bare

SSH 생성

클라이언트에서 실행

Email 인증 방식

Github 인증을 하려면 이 방식을 이용해야한다.

# 키 발급
$ ssh-keygen -t rsa -C "[email protected]"

# 클라이언트에 이메일 키 추가
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa

사용자 인증 방식

# 키 발급
$ ssh-keygen -t rsa

SSH 폴더로 이동해 인증키 복사

클라이언트에서 실행

$ cd ~/.ssh
$ vi id_rsa.pub

# id_rsa.pub의 내용을 복사한다.

인증키 등록

일반 서버

서버에서 실행

# ssh 폴더로 이동
$ cd ~/.ssh

# 인증키 파일을 연다.
$ vi authorized_keys

# id_rsa.pub에서 복사된 인증키를 하단에 추가한다.

Github

Github에서 실행

이메일 인증 방식으로 인증키를 생성해야하고 이메일은 github 에 로그인하는 이메일과 같아야한다.

키 등록

github 에 로그인 후 설정에 가서 복사한 키를 등록한다. image from hexo

인증여부 확인

클라이언트에서 실행

# 등록 후 에 클라이언트에서 인증여부를 확인한다.
$ ssh -T [email protected]

# You've successfully authenticated 가 보이면 인증완료

Git Repositiory 초기화

클라이언트에서 실행

$ git clone 서버유저명@서버아이피:[이름].git
# ex ) git clone [email protected]:test.git

· 약 3분

git add . 명령어 실행 후에 commit -m 명령어 실행 시, 또는 git commit -am 명령어로 바로 커밋시 add 가 되지 않은 것처럼 빨간 파일이 보일 경우

git add .
git add path_to_submodule

두 명령어를 다시 실행해본다.

diff 확인

그래도 add 가 안 되는 경우 diff 를 먼저 실행해본다.

git diff
git diff path_to_submodule

dirty diff 가 있을 경우

submodule 종속 제거

내 프로젝트 안에 git clone 으로 가져온 library 가 있는지 확인해보자.

git submodule foreach --recursive git checkout .

모듈이 없다는 결과가 나올 경우

  • git 에서 가져온 library 를 모두 확인하고
  • .git 폴더가 생성되어있으면 삭제

모듈 결과가 있는 경우

  • .gitmodule 파일의 해당 모듈 부분 삭제
  • git add .gitmodules
  • .git/config 파일의 해당 모듈 부분 삭제
  • git rm --cached path_to_submodule 캐시 삭제
  • rm -rf .git/modules/path_to_submodule 모듈 폴더 삭제
  • git commit -m "Removed submodule {name}" 모듈 종속 삭제를 커밋하고
  • rm -rf path_to_submodule 모듈 파일 모두 삭제

없는 경우

cached 파일 제거

git rm -r --cached .
git rm -r --cached path_to_submodule

untracked 파일 제거

git clean -d -x -f

-d 는 디렉토리 포함, -x 는 ignored 파일 포함, -f === force

commit 으로 초기화

git reset --hard

이 명령어는 마지막 방법이 되어야한다. 작업량을 다 날릴 수 있다.

여담

git 버전이 높아지면서 프로젝트 내에 git 에 종속적인 모듈이 있으면 add 자체가 안 된다. path_to_submodule 은 submodule 의 상대경로, 즉 add 가 안 되는 파일의 경로를 적으면 된다.