레이블이 git인 게시물을 표시합니다. 모든 게시물 표시
레이블이 git인 게시물을 표시합니다. 모든 게시물 표시

git-cliff and git commit template

# git-cliff 로 커스텀한 changelog 를 생성할 수 있다.
https://github.com/orhun/git-cliff
# 설치
brew install git-cliff

# 이제 git-cliff 또는 git cliff 명령을 사용할 수 있다.
# 설정파일(cliff.toml) 생성
git cliff --init

# cliff.toml 에서 사용하는 template 엔진 tera 사용방법
# https://www.conventionalcommits.org 포맷을 사용하지 않으면 다음 2개의 설정을 비활성화 해야 커밋 메시지 파싱을 할 수 있다.
vi cliff.toml
[git]
conventional_commits = false
filter_unconventional = false

# changelog 생성
# stdout 출력
git cliff

# CHANGELOG.md 파일로 출력
git cliff -o CHANGELOG.md

# 버전명시(v 로시작하는 것은 자동 cliff.toml에서 trim 처리)
# 버전명시 하지 않으면 [unreleased] 로 표시된다.
git cliff -o CHANGELOG.md -t v1.0.0

# 현재 태그에 대한 변경사항만 생성(새 태그 버전에서의 변경 사항만 파악할때 유용)
git cliff -o CHANGELOG.md --current

# v0.0.1 이후 HEAD까지의 변경사항 파악
git cliff v0.0.1..HEAD

# 특정 커밋(hash)부터 HEAD까지의 변경사항 파악
git cliff 4c7b043..HEAD
# 또는
git cliff 4c7b043..

#####

# commit 메시지 템플릿 적용 및 체크
# 참고 ~/.git/hooks 에 각종 hook sample 파일이 있다.
# hook 파일들도 푸시해서 관리하기 위해서 별도 hookPath 를 설정
git config core.hooksPath .githooks

# commit_message_template.txt 내용으로 커밋 메시지 생성
# 템플릿 파일 설정
git config commit.template .githooks/commit_message_template.txt

# git commit 실행시 처리 순서
1. pre-commit 에서 커밋 파일 체크
설정 파일 참고 https://github.com/ysoftman/test_code/blob/master/.githooks/pre-commit

2. prepare-commit-msg 에서 커밋 메시지 처리할 내용
3. (vim 으로) 커밋 메시지 작성

4. commit-msg 에서 메시지 규칙 체크

git repository not found error

# git clone 시 다음과 같은 에러 발생했다.
# 사설 github 은 되지만 github.com 만 클론되지 않았다.
remote: Repository not found.
fatal: repository 'https://github.com/ysoftman/test_code.git/' not found

# 해결 방법
# 참고로 system 메뉴에서는 삭제가 안되니 default keychains > login 에서 삭제해야 한다.
keychain Access.app > login 메뉴에서 github.com 이름의 키체인을 삭제

# 이제 push, pull 할때 맥에서 키체인 등록을 위한 사용자 암호를 입력하면 등록된다.
# 참고로 다음과 같이 수동으로 등록할 수도 있다.(마지막에 엔터 2번입력해야 반영된다.)
git credential-osxkeychain store
host=github.com
protocol=https
username=ysoftman
password={깃헙 PAT(personal access token}

#####

# 특정 저장소에서 git push 하면 다음과 같이 권한이 없다는 에러가 발생한다.
remote: Write access to repository not granted.
fatal: unable to access 'https://github.ysoftmancom/test/test/': The requested URL returned error: 403

# 원인은 ~/.git-credentials 에 같은 호스트에 2개의 계정을 설정했는데
# 첫번째줄이 우선 적용되어 실제 권한이 있는 ysoftman 대신 foobar 계정이 키체인으로 등록돼 발생한 것이다.
# 다음과 같이 ysoftman 계정을 첫번째줄로 설정하면 ysoftman 이키체인에 등록되어 해결된다.
https://ysoftman:ghp_bbb222@github.ysoftman.com
https://foobar:ghp_aaa111@github.ysoftman.com

commit does not belong to any branch

# 잘못된 email 주소가 있어 수정하기 위해 아래 포스팅한 rebase 스크립트를 실행했다.
# rebase 후 tag 를 푸시하지 않았고 no branch(브랜치가 없는) 커밋으로 남게 됐다.
# git log 에는 보이지 않지만 tig cli 툴로 보면 최초 커밋 이전에 수정전 커밋이 no-branch 상태로 추가되어 보인다.

# tig 에서 봤을때 tag 커밋은 no branch 상태로 email 도 수정되지 않은 상태였다.
# 깃헙에서 no-branch 커밋을 보면 다음과 같은 메시지가 나온다.
https://github.com/xxxx/commit/{커밋해시} 
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

# 또 다음 명령으로 커밋이 포함된 브랜치를 찾아도 결과가 없다.
git branch --contain {커밋해시}

# 문제는 tig 로 보면 no-branch 커밋들이 최초 커밋 이전에 중복되어 보인다는 것이다.

# [해결방법]
# 다시 위 포스팅의 rebase 스크립트(이름,email 값 변경해서)를 실행했다.
# mater, develop 강제 푸시해도 변경사항이 없다고 나왔지만, tag 는 강제 푸시가 됐다.
git push --tags -f

# tig 에서 다시 확인해보니 email 수정된 tag 커밋이 제대로 반영됐다.(해결!)

# [로컬 refs 제거방법]
# 추가로 no branch (tag) 커밋들은 다음과 refs/.. 로만 표시된다.
refs/original/refs/tags/1.0.0
refs/original/refs/tags/1.0.1

# refs 는 로컬에 남아 있는 참조 정보라 지워도 된다.
# refs 지우기
# 방법1
# 다음과 같이 일일히 삭제하면 된다.
git update-ref -d refs/original/refs/tags/1.0.0
git update-ref -d refs/original/refs/tags/1.0.1

# 방법2
# 아래 경로의 파일들을 삭제해도 된다. 하지만 .git 내용을 직접 수정하는거 권장되지 않는다.
rm -rf .git/refs/original

# 방법3
# 삭제해야할 refs 가 많다면 이미 remote(origin) 에는 푸시됐으니 로컬에서 새로 클론 받자.
git clone http://{저장소}

# 참고로 이제 tig 에선 no branch 상태의 커밋들이 보이진 않지만
# https://github.com/xxxx/commit/{커밋해시} 에는 여전히 no branch 커밋들을 확인할 수 있다.
# rebase 가 수정된 새로운 커밋을 생성하는거고 이전의 no branch 커밋들은 유효하지 않은 상태로 github 저장소에 계속 남아 있는 것으로 보인다.
# 이 부분은 제거가 안돼서 저장소를 새로 만들어야 하는것 같다.

git push Repository not found

# git push 할때 정확한 URL 로 pull 도 되지만, 다음과 같이 Repository not found 가 발생하는 경우가 있다.
git push
remote: Repository not found.
fatal: repository 'https://github.com/ysoftman/test_cod.git/' not found

# 해당 사용자에게 쓰기권한(push)을 부여하면 된다.
깃헙 저장소 > setting > collaborators > manage access > add people > 사용자 선택 후 write 나 admin role 으로 추가하면 된다.

# 흠, not found 대신 push 권한이 없다고 알려주면 좋을텐데~

dvc(data version control) command

dvc(data version control) 는 말 그대로 데이터 버전 컨트롤 cli 툴이다.
데이터의 메타 정보는 git 으로
실제 데이터를 git lfs 나 별도 리모트 스토리지(s3,gs,azure,ssh 등)에 저장해 관리한다.
주로 ML reproducible 을 위래 데이터나 모델을 버저닝에 많이 사용한다.

# brew 로 설치시
brew install dvc

# pip 로 설치시
pip install dvc

# git 프로젝트로 이동해서
# dvc 초기화(설정 파일 생성)
dvc init

# 초기화 되면 다음 파일을 생성되고 스테이지에 추가되어 있다.(git add 되어 있음)
# 이를 커밋,푸시해줘야 한다.
# 참고로 .gitignore 는 git 이 사용하는 설정으로 dvc 가 트랙하는 파일과 중복되지 않도록 무시하도록 하기 위해 필요하고 .dvcignore 는 dvc 가 dvc 에 사용하지않은 파일은 무시하기 위한 설정이다.
# git status
# new file:   .dvc/.gitignore
# new file:   .dvc/config
# new file:   .dvcignore
git commit -m "initialize dvc"
git push

# dvc remote 저장소(스토리지) 추가
# s3 추가 
# -d --default set as default remote.
dvc remote add -d ysoftman_s3 s3://버킷명

# google drive 추가시(해시값은 google drive 경로이동후 주소 표시줄에 마지막에 표시된다.)
dvc remote add -d ysoftman_gdrive gdrive://1IJetT6gdSjOU6t4BC-VgLya8RDaQQWMU

# 설정 확인
# .dvc/config 에 아래 스토리 정보가 추가된다.
# [core]
#    remote = ysoftman_gdrive
# ['remote "ysoftman_s3"']
#    url = s3://버킷명
# ['remote "ysoftman_gdrive"']
#    url = gdrive://1IJetT6gdSjOU6t4BC-VgLya8RDaQQWMU
dvc config -l

# 변경된 config 커밋
git add .dvc/config
git commit -m "configure dvc remote stroage"

# 간단한 data/data.csv 파일을 만들고
mkdir data
echo "apple,lemon,orange" > data/data.csv

# dvc 트랙(dvc로 관리,추적할 파일)에 추가
dvc add data/data.csv

# dvc add 되면,
# data/datav.csv.dvc 로 .dvc 확장가 붙은 메타정보(해쉬,경로등)파일이 생성된다.
# data/.gitignore 가 생성되면 /data.csv 가 추가되어 git 에서 무시하도록 한다.

# git 에는 메타 정보 파일과 .gitignore 파일을 커밋한다.
git add data/data.csv.dvc data/.gitignore
git commit -m "add data.csv meta"

# 이제 dvc push 하면 현재 -d(default)로 설정된 google drive 로 푸시한다.
# google drive 의 인증 URL 이 표시되고 해당 페이지에 인증후 인증코드를 터미널에 입력
# .dvc/tmp/gdrive-user-credentials.json 인증정보가 저장된다.
# google drive 에 랜덤(.dvc 에 있는 해시값중 앞2자리)이름이 디렉토리로 생성되며 그안에 특정 바이너리 파일로 저장된다.
dvc push

# git 에도 .dvc 메타정보 .gitignore 파일 push
git push

# 데이터를 변경해보자.
echo "banana,mango" >> data/data.csv 

# 변경된 데이터 파일을 dvc 트랙에 추가한다.
# storage 내에 새로운 디렉토리로 저장된다.
dvc add data/data.csv
dvc push

# 자동으로 data.csv.dvc 파일도 변경됐으니 이것도 커밋,푸시한다.
git add data/data.csv.dvc
git commit -m "update data"
git push

# git checkout 등으로 히스토리(버전)로 변경 후 dvc checkout 하면 .dvc 메타정보에 맞는 파일로 변경된다.
git checkout abc123
dvc checkout

# git 에는 .dvc 메타정보만 있기 때문에 git 저장소를 로컬에 새로 clone 받은 경우
# dvc pull 하면 버전에 맞는 데이터가 다운로드 된다.

# 데이터를 삭제할 때
# data/.gitignore 에서 data2.csv.dvc 가 빠진다.
dvc remove data/data2.csv.dvc
# 변경 사항 커밋
git add data/.gitignore
git add data/data2.csv.dvc
git commit -m "remove data2"

# dvc remote storage 확인
dvc remote list

# 디폴트 스토리지 변경
dvc remote default ysoftman_s3 

# dvc 서비스되는 파일 보기 /data path
# github > .dvc/config > ysoftman_s3 가 디폴트인 경우
dvc list https://github.com/ysoftman/dvc_test/ data


#####


# google-drive client_id, client_secret 설정
# google cloud > api & service > credentials > oauth 2.0 client ids > desktop app > client id, client secret 파악 후 dvc 설정 후
# github 으로 푸시
dvc remote modify ysoftman_gdrive gdrive_client_id '123'
dvc remote modify ysoftman_gdrive gdrive_client_secret '123'
git commit .dvc/config -m "add ysoftman_gdrive credentials"
git push

git lfs(Large File Storage) command

git lfs(Large File Storage) 는 dataset,audio,video 같은 용량이 큰 파일을 저장해주는 서비스이다.

github 은 파일 1개 용량이 100MB 넘는 파일을 푸시를 막고 있다.

100MB 넘은 파일을 push하면 다음과 같은 에러가 발생한다.
remote: error: File aaa.zip is 100.59 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage
! [remote rejected] master -> master (pre-receive hook declined)

https://github.com/settings/billing > git lfs data 를 보면 계정당 1GB 용량까지는 무료고 그 이상은 유료다.

# git lfs 설치
brew install git lfs

# 현재 계정 lfs 초기화
git lfs install

# 초기화 하면 ~/.gitconfig 설정에 다음 내용이 추가된다.
[filter "lfs"]
  clean = git-lfs clean -- %f
  smudge = git-lfs smudge -- %f
  process = git-lfs filter-process
  required = true

# 이제 github 프로젝트 디렉토리로 이동한다.
# 트랙된 파일들은 LFS 로 저장되고 관리된다.
git lfs track "*.jpg"
git lfs track "*.zip"
git lfs track "*.tar.gz"

# 트랙되고 있는 패턴 보기
git lfs track

# .gitattributes 에 다음과 같이 설정되니 이 파일을 직접 수정해도 된다.
cat .gitattributes
*.jpg filter=lfs diff=lfs merge=lfs -text
*.tar.gz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text

# .gitattributes 파일을 커밋해야 github 에서 lfs 로 트랙할 수 있다.
git add .gitattributes 
git commit -a -m "add lsf settings"
git push

# 이제 파일을 커밋 및 푸시
git add xelloss.jpg
git add pizza_or_not_pizza.zip
git commit -a -m "lsf test"
git push

# 커밋된 트랙 파일들 보기
git lfs ls-files

# github 에서 파일을 클릭하면 다음과 같이 LFS 에 저장되어있다고 나오며 download 할 수 있다.


merge two git repostiory

# 2개의 깃 저장소를 합쳐보자
# 로컬에 repo1, repo2 각각 저장소를 사용한다고 가정하고
# repo1 += repo2 으로 repo1 기준으로 repo2 저장소를 추가하여 병합한다.

# repo1 에서 repo2 리모트 추가
git remote add repo2 https://github.com/ysoftman/repo2

# remote 상태를 확인하면 origin 외 repo2 도 추가된것을 알 수 있다.
git remote -v
repo2 https://github.com/ysoftman/repo2 (fetch)
repo2 https://github.com/ysoftman/repo2 (push)
origin https://github.com/ysoftman/repo1 (fetch)
origin https://github.com/ysoftman/repo2 (push)

# repo2 내용(브랜치,태그등 정보)을 최신으로 가져온다.
git fetch repo2

# 이제 커밋 로그를 보면 (repo2/...)의 내용도 같이 보인다.
# repo2 의 master 브랜치내용로 하는 로컬 브랜치를 만든다.
git checkout -b old_repo2 repo2/master

# (optional) repo2 -> B 디렉토리를 생성하고 하위로 옮기는 커밋

# 이제 (repo1기준) master 로 바꾸고
git co master

# (optional) repo1 -> A 디렉토리를 생성하고 하위로 옮기는 커밋

# old_pro2 -> master 로 머지한다.
git merge old_repo2

# Fatal: refusing to merge unrelated histories 에러 발생시
# git merge old_repo2 --allow-unrelated-histories

# 리모트에 푸시
git push

# 이제 필요없는 repo2 리모트 저장소 설정에서 제거
git remote remove repo2

github 인증 방식 변경

2021-08-13 부터 github 인증 방식이 변경돼, 푸시하면 다음과 같이
PAT(personal access token)를 사용하라고 나온다.

remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: unable to access 'https://github.com/ysoftman/test_code/': The requested URL returned error: 403

PAT 생성, 토큰 생성 후 한번만 보이기 때문에 복사해둔다.

# 혹시 기존 암호가 저장되어 있으면 삭제한다. (나중에 PAT 값으로 새로 생성된다.)
Keychain Access.app  -> github.com 삭제

# 이제 푸시할때 password 를 물어보는데 이때 암호 대신 PAT 를 입력한다.
git push
Username for 'https://github.com': ysoftman
Password for 'https://ysoftman@github.com': 토큰값

go mod 캐시 삭제

# 사내 네트워크에서
# git 버전 변경이나 저장소 변경 등으로 사용중이 go.mod 의 변화가 있을때
# 빌드시 다음과 같은 패키지를 가져오지 못하는 403 에러가 발생한다.
go: github.aaa.com/ysoftman/sample@v0.1: unrecognized import path "github.aaa.com/ysoftman/sample" (https fetch: Get https://github.ysoftman.com/ysoftman/sample?go-get=1: Forbidden)

# proxy 환경 변수 중 no_proxy 에 추가한다.
export no_proxy=github.aaa.com,github.bbb.com

# 참고로 패키지 경로를 찾지 못하는 경우
https://github.com/golang/go/issues/27238#issuecomment-432793244
# mod 로 다운로드 받은 모든 패키지 삭제
go clean -modcache

# 테스트 결과물 캐시 삭제시
go clean -testcache

# 빌드 결과물 캐시 삭제시
go clean -cache

사설 github 패키지 가져오기

# docker(도커) 환경에서 go get/test 등으로 패키지를 다운받지 못하는 문제가 있다.
# 테스트로 단순 git clone 을 해보면 username 이 없어 에러가 발생한다.
fatal: could not read Username for 'https://github.ysoftman.com': terminal prompts disabled

# 사설(사내) github 보안으로 사용자 인증이 있어야 한다.
# 환경변수로 go get 할때도 id/pw 를 입력 받게할 수 있다.
GIT_TERMINAL_PROMPT=1 go get https://github.ysoftman.com
Username for 'https://github.ysoftman.com': ysoftman
Password for 'https://ysoftman@github.ysoftman.com': aaa111

# 또는 도커내에서 git 설정을 해줘도 된다.
git config --global user.email "ysoftman@gmail.com"
git config --global user.name "ysoftman"
git config --global credential.helper store
echo 'https://ysoftman:aaa111@github.ysoftman.com' > ${HOME}/.git-credentials

git commit master 브랜치 방지

# 보통 별도의 브랜치를 생성해서 작업해 커밋하고
# master, develop 브랜치에는 github 페이지에서 pull request 하게 된다.
# 만약 로컬에서 master, develop 브랜치 상태에서 커밋을 방지하려면
# 다음과 같이 pre-commit 파일을 만들어 주면 된다.
# 참고로 아래처럼 cat 사용시 구분자 (zzz) 를 '' 또는 "" 로 묶어줘야 한다.
# 아니면 $는 이스케이프(\)처리해줘야 한다.
cat > .git/hooks/pre-commit << 'zzz'
#!/bin/sh
branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$branch" = "master" ] || [ "$branch" = "develop" ]; then
  echo "You can't commit directly to $branch branch"
  exit 1
fi
zzz
chmod +x .git/hooks/pre-commit

# 이제 master, develop 등에 브랜치에서 commit 명령을 실행하면
# 위 에러메시지 출력 후 커밋이 진행되지 않는다.

git sub(custom)command 사용하기

t-명령이름 으로 실행할 파일을 만들고
vi git-ysoftman
#!/bin/bash
echo "ysoftman's custom git command test"
chmod +x git-ysoftman

# 다음과 같이 명시하면 현재 위치에서는 커스텀 명령이 실행된다.
git ysoftman

# 만약 현재경로에서 git ysoftman 실행시 다음과 같은 에러가 발생하면
git: 'ysoftman' is not a git command.
# GIT_EXEC_PATH 환경변수를 현재디렉토리로 설정해 실행한다.
# https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EB%82%B4%EB%B6%80-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98
GIT_EXEC_PATH=$(pwd) git ysoftman

# 또는
git --exec-path=. br

# 또는
# bash, zsh 등에서 git-subcommand 를 현재 디렉토리에서 실행하기 위해
# PATH 환경변수 처음이나 마지막에 구분자(:)가 있거나
# PATH 중간에 :: 부분이 있어야 한다.
# ./a.sh 대신 a.sh 실행 가능해야 한다.
export PATH=$PATH:

# 또는
export PATH=:$PATH

# 또는
export PATH=/bin::$PATH

# 참고
# 다음 옵션으로 현재 사용중인 command 경로를 알 수 있다.
git --exec-path

# git 명령이 어떻게 수행되는지 trace 해볼 수 있다.
# 2값이상을 주면 open file descriptor 번호로 파악해서 해당 파일로 trace를 기록한다.
GIT_TRACE=2 git ysoftman

centos git 최신 버전 빌드하기

# redhat, centos 에서 yum 으로 설치되는 git version 은 1.8 정도가 최신이다.
# 그래서 yum 대신 소스를 다운받아 직접 빌드 및 설치를 해야 한다.
https://git-scm.com/download/linux

# git 을 빌드하려면 개발용 curl, perl 이 필요하다.
sudo yum install -y curl-devel perl-devel

# 최신 버전의 소스를 다운받아 빌드 및 설치한다.
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.20.0.tar.gz
tar zxvf git-2.20.0.tar.gz
cd git-2.20.0
make configure
./configure
make -j4 all
sudo make install

# 버전 확인
/usr/local/bin/git version

# 만약 다음과 같이 /usr/bin/git 이 우선한다면
which -a git
/usr/bin/git
/usr/local/bin/git
/usr/bin/git
/bin/git
/usr/local/bin/git

# /usr/local/bin/git 에서 먼저 찾도록 PATH 환경변수를 수정하자.
export PATH=/usr/local/bin/:$PATH


#####


# yum repo 를 추가해서 설치할 수도 있다.
sudo yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm

# git 2.x로 업데이트
sudo yum install git

github CODEOWNERS 설정

# 저장소 docs/CODEOWNERS 를 다음과 같이 설정하면
# github 에서 Pull-Requests 을 생성할때 리뷰어가 자동 지정된다.
vi doc/CODEOWNERS
*.h  @ysoftman @bill
*.cpp @ysoftman

# 한가지 주위할 점은 계정이름에 . 있다면 - 로 변경해야 한다.
*.cpp @ysoftman.123 <--- error
*.cpp @ysoftman-123 <--- ok

# 참고 https://blog.github.com/2017-07-06-introducing-code-owners/

sourcetree 삭제된 원격 브랜치가 보이는 문제

# 터미널에서 원격 브랜치를 파악한 결과와
git ls-remote | grep ysoftman

# sourcetree 에서 
원격 -> origin -> feautre -> ysoftman... 

# 브랜치 내용이 다른 경우가 있다.
# 실제 github 기준으로 보면 sourcetree 내용이 잘못된것을 알 수 있다.

# 이와 관련해서 문의한 내용이 있다.


# 로컬에 stable 브랜치가 생기는 이유는 로컬에서 삭제하지 않고 github 에서 삭제해서다.

# prune 옵션 설명
Deletes all stale remote-tracking branches under <name>. These stale branches have already been removed from the remote repository referenced by <name>, but are still locally available in "remotes/<name>".
With --dry-run option, report what branches will be pruned, but do not actually prune them.

# 다음과 같이 prune 옵션으로 stable 브랜치들을 지워서 갱신하면 된다.
git remote prune origin


# 위 명령을 실행하면 실제 원격 브랜치에 없는 것들은 로컬에서 pruned 된다.
# 이제 sourcetree 리프레시 다시 확인하면 실제 없는 브랜치들이 사라진것을 확인 할 수 있다.

git push 된 커밋 사용자 name, email 변경

# 현재 저장소 ./git/config 에 user(name, email) 을 설정하지 않은 상태에서
# 전역 ~/.gitconfig 에 설정된 회사 user(name, email) 로
# 오랫 동안 commit , push 하고 있었다.
# github 에선 등록되지 않은 email 로 contribution 카운트가 누락된다.
# 이미 push 된 커밋들의 author(user name, email)를 변경할 수 있다.
# 참고 https://www.git-tower.com/learn/git/faq/change-author-name-email

#####

# [첫번째 방법]
# 잘못된 author 로 커밋이 일어나기 전의 커밋으로 rebase 한다.
# 잘못된 커밋 해시 이후 부터 head 까지의 커밋들을 수정할 수 있다.
# -i, --interactive 사용자가 rebase 하기전에 수정할 수 있도록 한다.
# --preserve-merge 를 옵션을 사용하지 않으면 하나의 브랜치 커밋들로 변경된다.
git rebase -i --preserve-merge 잘못된_커밋_이전_커밋_해시

# 최초 커밋부터 잘못되었다면
git rebase -i --root

# 이제 rebase 커밋 이후의 모든 커밋들이 vim 에디터로 보인다.
# 위쪽 부터가 오랜된 커밋이다.
# github 커밋 기록을 보면서 잘못된 커밋은 pick -> edit 또는 e 로 변경해 저정한다.
# 참고로 s 로 하나의 커밋을 합칠 경우 맨처음(맨위) 커밋은 pick, 그 뒤 합칠 커밋들은 s 로 변경해 저장하면 커밋 메시지들이 하나로 모인다. 여기서 메시지를 편집해서 저장한다.


# 이제 터미널에서 커밋마다 author 만 수정한다.
# 참고로 --abort 로 rebase 취소할 수 있다.
git commit --amend --author="ysoftman <ysoftman@gmail.com>" --no-edit

# rebase 계속 진행(다음 커밋으로 이동)
git rebase --continue

# 위 두과정을 커밋이 없을때까지 반복한다.
# 더이상 진행할 커밋이 없으면 다음과 같은 메시지 나온다.
Successfully rebased and updated refs/heads/master.

# master, develop, feature 등 로컬의 브랜치 마다 강제 push 한다
git push -f

# 혹시 로컬에 rebase 전 상태로 clone 받은 곳이 있고, 여기서 git pull 하면
# 이곳에선 rebase 수정전 커밋들이 그대로 남아있고 수정한 커밋들이 추가되는 형상이 된다.
# 여기서 push 하면 다시 수정한 커밋들이 푸시되니 이런 clone 은 삭제하자.

#####

# [두번째 방법]
# 우선 git pull 받아 최신 상태로 업데이트한다.
https://git-scm.com/docs/git-filter-branch
# 다음 스크립트를 이용해 한번에 변경할 수 도 있다.(완전 편함~ㅋ)
git filter-branch --env-filter '
WRONG_EMAIL="wrong@example.com"
NEW_NAME="ysoftman"
NEW_EMAIL="ysoftman@gmail.com"
if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$NEW_NAME"
    export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$NEW_NAME"
    export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

# pull 표시가 나더라도 pull 없이 강제 push 한다.
# master, develop, feature, tag 등 로컬의 브랜치들을 강제 push 한다.
git push origin master -f
git push origin develop -f
git push --tags -f

# git filter-branch 를 실행해서 다음과 백업이 있어 실행하지 못한다면
# git filter-branch 뒤에 -f 로 강제(백업 덮어쓰기)할 수 있다.
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

# 로컬에 refs/original/refs/... 참조가 보이면 삭제한다.
# 업데이트할 참조가 많다면 새로 clone 받는것이 편할 수 있다.
git update-ref -d refs/original/refs/heads/master
git update-ref -d refs/original/refs/heads/develop

#####

# 실제 커밋(contribute) 수 보다 적게 표시되는 상황


# author 수정 후 정상 카운트 되는 contributions


#####

# rebase 이전의 커밋들이 보일 수 있다.
# 이를 표시하지 않으려면 해당 release 혹윽 태그를 삭제해야 한다.
git tag -d ysoftman-release-1
git tag -d ysoftman-hotfix-1

#####

# 참고로 여러 커밋을 합치는 경우 위 vim 커밋 수정화면에서
# 방법1
# 합칠 커밋들을 s 또는 squash 로 변경해 저장한다.
# s 로 표시한 커밋과 s 바로 이전 커밋이 vim 편집 화면이 열리고 커밋 메시지를 수정하고 저장하면 s -> s 이전 커밋으로 합쳐진다.
# 방법2
# 합칠 커밋들을 f 또는 fixup 로 변경해 저장한다.
# f 로 표시한 커밋 메시지는 vim 편집 화면 없이 삭제되며 f -> f 이전 커밋으로 합쳐진다.

git - AggregateException encountered 에러

# 윈도우에서 git push 하면 다음과 같은 에러가 발생한다.
fatal: AggregateException encountered.

# 윈도우 git-credential 이슈가 있었고 해결되었다고 한다.
https://github.com/Microsoft/Git-Credential-Manager-for-Windows/issues/559

# git 버전 확인
git version 2.11.1.windows.1

# 최신 2.16 이상의 최신 git 을 설치하면 해결된다.
https://git-scm.com/download/win

mac os 업그레이드 후 git 오류

# mac os 업그레이드 후 git 명령 실행시 다음과 같은 에러가 발생한다.

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

# 다음 명령으로 CommandLineTools 를 다시 설치하면 된다.
xcode-select --install

vagrant up rsync 에러 해결하기

# 윈도우 administrator 계정에서
# vagrant box add centos/7
# vagrant init centos/7
# 설정하여 vagrant up 시 다음과 같은 에러가 발생한다.
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/7' is up to date...
"rsync" could not be found on your PATH. Make sure that rsync
is properly installed on your system and available on the PATH.

# 호스트가 윈도우인데 rsync 를 사용하게 설정되어 있어 발생한것이다.
# 다음 경로의 centos/7 box 의 vagrantfile 에서 type 의 rsync 부분을 삭제하도록 한다.
C:\Users\Administrator\.vagrant.d\boxes\centos-VAGRANTSLASH-7\1611.01\virtualbox\Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.base_mac = "525400225b53"
  config.vm.synced_folder ".", "/vagrant", type: ""
end

# vagrant ssh 수행시 ssh 클라이언트가 없다면
# https://git-scm.com/download/win 에서 git 을 설치해야 한다.
# 설치시 windows command prompt 에서도 ssh 를 사용할 수 있도록 "use git and optional unix tools from the windows command prompt" 를 선택하자.


github pages 사용하기

[github pages ?]
github 에서 무료로 호스팅하는 웹페이지로 github.io 도메인을 사용한다.
페이지의 저장소는 1GB 사용할 수 있어 다양하게 활용될 수 있다.

[github pages 생성]
1. "계정명.github.io"(ysoftman.github.io) 이름의 저장소를 생성
2. index.html 파일을 저장소 루트 경로에 추가
3. 이제 https://ysoftman.github.io/ 접속하면 index.html 내용이 보인다.

[github page 자동 페이지 생성]
ysoftman.github.io 저장소 -> settings -> github pages -> overwrite site -> launch automatic page generator
실행하면 다양한 기능(header,footer,theme...)을 손쉽게 설정할 수 있다.
내용은 markdown 형식으로 작성하고 publish page 하면 저장소에 images, css, html 등이 자동 생성(수정)되는것을 알수 있다.

[jekyll 사용하기]
지킬박사와 하아드에서 '지킬'을 뜻함~ㅋ
지킬은 ruby 오픈소스로 디렉토리 전체를 웹페이지로 변경해주는 툴이다.
사실 github pages 뒷단에서는 지킬 이 돌고 있다고 한다.

# jekyll 설치
gem install jekyll

# 기타 설치
gem install bundler
gem install minima

# 디렉토리 내용을 자동 생성
cd test
jekyll build

자동생성후 test/에서 jekylly serve 하면 http://localhost:4000 으로 서비스할 수 있다.
또는 자동생성된 파일들을 github page 로 올려 사용해도 된다.

참고
https://jekyllrb-ko.github.io/