git 에서 줄바꿈 문제 - CRLF, LF

어느날 git 의 레포지토리의 파일이 모두 changed 상태로 보여 당황했다. 한 파일을 diff 로 보니 줄의 마지막에 ^M 이 보였다. 에디터가 OS에 따라서 LF 를 CRLF 로 바꿔서 보여주는 것이었다.

CRLF 상황

Linux 를 20.04 LTS 를 사용하다 os-release-upgrade 를 사용해서 22.04 LTS 로 업그레이드 했다.

그리고 한동안 다른 작업을 하다 소스를 다루게 되어서 윈도우 11에서 VS code 로 WSL의 우분투 폴더를 열어 보니 git 의 staging area 에 커밋할 파일이 엄청 들어와 있는 것이다. 찾다 보니 아래 그림 같이 줄바꿈 코드로 CRLR 로 인식을 한 것이다.

소스 파일을 수정할 일이 아니라서 검색을 좀 해보니 git 의 전역 설정에서 가능할 것 같았다. 다음 링크를 참조했다.

  1. https://stackoverflow.com/questions/28076760/git-add-adds-m-to-the-end-of-every-line
  2. https://github.com/Microsoft/WSL/issues/2318

git 전역 설정으로 autocrlf 를 활성화 한다. git 전역 설정에 다음 같이 autocrlf 를 true 지정하면 해결이 된다.

1
$ git config --global core.autocrlf true

[git] Swallow clone 과 브랜치

Swallow Clone 은 git 저장소에 커밋된 기록중 일부만 사용하는 기술 있다. 그런데 브랜치를 추가하면 원격지와 클론한 저장소에서 탐색이 안되는 단점이 있다. 여기서 swallow clone 에서 branch를 사용하는 방법을 요약한다.

Swallow Clone 에서 branch를 사용하자.

기본적으로 swallow clone 을 사용하면 원격 저장소의 branch 를 모두 볼 수 없다. 이것은 .git/config 를 보면 refs/remotes/origin/master 로 구성되어 있어서이다. 그래서 swallow clone 한 저장소는 원격 저장소의 master 브랜치만 보게 된다.

다음은 .git/config 의 일부이다.

1
2
3
[remote "origin"]
url = git@github.com:repository/YOUR_REPO.git
fetch = +refs/heads/*:refs/remotes/origin/master

master 브랜치 대신 브랜치 트리 모두를 보려면 아래 같은 단계로 처리해 준다.

  1. 다음 같이 원격 저장소의 모든 브랜치를 대상으로 처리해 준다.
1
git remote set-branches origin '*'

origin 의 브랜치를 master에서 * 로 지정하면 .git/config가 아래 같이 수정된다.

1
2
3
[remote "origin"]
url = git@github.com:repository/YOUR_REPO.git
fetch = +refs/heads/*:refs/remotes/origin/*
  1. 이어서 원격 레포지토리를 업데이트 하면 관련한 브랜치 정보를 갱신한다.
1
2
3
4
5
6
7
8
9
10
11
$ git remote update
Fetching origin
remote: Enumerating objects: 306, done.
remote: Counting objects: 100% (306/306), done.
remote: Compressing objects: 100% (283/283), done.
remote: Total 285 (delta 161), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (285/285), 8.59 MiB | 4.35 MiB/s, done.
Resolving deltas: 100% (161/161), completed with 16 local objects.
From git@github.com:repository/YOUR_REPO.git
* [new branch] 1024_dev -> origin/1024_dev
* [new branch] gt_master -> origin/gt_master
  1. 업데이트 한 후에 원격 브랜치만 검색해도 잘 나타난다.
1
2
3
4
5
$ git branch -r
origin/1024_dev
origin/HEAD -> origin/master
origin/gt_master
origin/master
  1. 원격지 브랜치를 체크아웃해서 사용하면 된다.
1
$ git checkout -b t origin/1024_dev

함께 보면 유용한 git 명령

간단하게 빌드/테스트 를 하기위함 이라면 `Sparse-checkout`` 과 함께 이용하면 좋다.

  1. [git] Sparse Checkout
  2. Swallow Clone

[git] Swallow clone

shallow clone 은 git저장소의 일부 이력만 받아오는 방법이다. 즉 git 커밋등의 이력이 많아지고, 저장소 용량이 커지면 clone을 받는데, 시간도 많이 걸리고 저장소 크기도 용량이 커져서 clone, push, pull 시 시간 손해가 있을 수 있고, 어떤 경우 중단되는 경우도 있을 수 있다.

그래서 git저장소의 일부 이력만 선택적으로 받아 올 수 있다.

  1. 보통 swallow clone 은 저장소를 build & deployment 를 수행 할 때 유용하다.
  2. 저장소 소스를 수정하고 push 하는 경우에는 불리하다.

swallow clone

swallow clone을 위해서 git clone에 depth 인자에 주어진 개수만큼의 history 를 가져온다.

1
git clone [repo_url] --depth [개수]

최종 commit 부분만 swallow clone 하기

최종 history (git commit log) 만을 대상으로 clone 한다면 depth 1 로 주면 된다.

1
git clone --depth 1 abcd@git.com/abc/big_repository

git log를 보면 1개의 로그만 나타납니다. 기록이 하나밖에 안남는다.

1
git log 

100개의 기록 더가져오기

swallow clone한 저장소에서 fetch 를 사용해서 추가적인 log 기록을 더 가져올 수 있다.

1
2
git fetch --depth 50
git fetch --depth 50

주의!!!

현재 개발된 코드를 확인하고, 빌드하고 그리고 실행하고 테스트하는데는 shallow clone은 가볍게 수행할 수 있는 장점이 있다. 그런데 . 저장소에서 소스를 수정하고 push 하려고 하려면 저장소의 모든 Git 이력을 이용해 이 수정된 내용이 적용되야 한다. 그런데 swallow clone 상태에서는 어떤 기록에서 편집되었는지에 대한 것을 확인할 수 없어서 push가 거부될 수 있다.

이런 경우에는 unswallow 를 통해서 모든 history 를 복구한 후에 작업을 수행해야 한다.


unswallow 하기

기존 –depth 로 swallow clone 이 된 레포지토레애서 Un-swallow 를 하기 위해서 fetch 명령을 이용한다.

1
$ git fetch --unshallow # 저장소의 남은 history 를 읽어온다

함께 보면 유용한 git 명령

간단하게 빌드/테스트 를 하기위함 이라면 `Sparse-checkout`` 과 함께 이용하면 좋다.

[git] Sparse Checkout



- 참고

Hexo - icarus theme 설치: git기반

이전 글 Hexo: icarus 테마 git기반 설치와 업그레이드 에 변경과 configurationsfile 을 더한 내용이다.

static file 기반 블로엔진인 Hexo에서 테마로 icarus 를 사용하려고 한다. 여기서는 icarus theme를 git으로 설치한다. 그리고 최신 버전으로 업그레이드 하는 과정을 살펴본다. 또한 icarus theme의 구성 파일에 대해서 좀 더 세부적으로 살펴본다.

  1. Icarus theme git 설치
  2. Configuration files
  3. Upgrade

1. Icarus theme git 설치

icarus 테마는 getting-started-with-icarus 에 설명이 되어 있다. 여기서는 git 을 클론해서 사용해 보도록 하겠다.


- git clone

icarus 릴리즈 페이지 https://github.com/ppoffice/hexo-theme-icarus/releases 를 확인해서 원하는 버전 번호를 찾는다. hexo 프로젝트 폴더에 들어가서 아래 같이 5.0.0 버전을 지정해서 클론을 수행한다.

1
2
$ cd PROJECT_FOLDER
$ git clone https://github.com/ppoffice/hexo-theme-icarus.git themes/icarus -b 5.0.0 --depth 1

클론한 결과는 아래 같은 폴더 구조를 갖는다.

1
2
3
4
5
6
themes/icarus
├── include
├── languages
├── layout
├── scripts
└── source

- 설정

이제 hexo의 구성 파일 _config.yml 에 테마를 icarus 로 지정한다.

1
2
#_config.yml
theme: icarus

그리고 icarus 구성 파일 _config.icarus.yml 에 먼저 버전을 명시하고 icarus 테마 관련 설정을 진행한다.

1
version: 5.0.0


Configuration files

Icarus theme의 구성파일은, jyekyll 의 구성요소 + icarus 구성 파일로 제공한다. 구성 파일을 통해서 여러 형식의 화면 표현을 가능하게 한다. _config.yml 와 같은 위치에 있으면 된다.

아래는 구성파일의 우선순위 순서로 작성되어 있다:

  • _config.yml: 사이트 구성 파일 (jekyll 의 기본 구성파일)
  • _config.icarus.yml: Icarus theme 기본 구성파일.
  • 레이아웃 구성 파일
    • _config.post.yml : 글 내용 POST 레이아웃 화면/위젯 구성
    • _config.page.yml : 페이지의 레이아웃 화면/위젯 구성
  • Jykell 의 Post/page front-matter
  • (Deprecated) Legacy theme configuration file at themes/icarus/_config.yml
  • (Deprecated) Legacy layout configuration file at themes/icarus/_config.post.yml and themes/icarus/_config.page.yml

Layout Configuration Files

레이아웃 구성은 icarus theme 의 구성파일과 같은 구조를 갖는다. 모든 블로그 포스트의 레이아웃을 위해서 _config.post.yml 파일을 참조한다. 그리고 _config.page.yml 은 사용자 지정 페이지를 위한 레이아웃에 적용된다.

_config.icarus.yml 파일:

  • 세 개의 컬럼으로 사이트의 레이아웃을 배치한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    widgets:
    -
    type: recent_posts
    position: left
    -
    type: categories
    position: right
    -
    type: tags
    position: right

_config.post.yml 파일

  • POST는 위젯 위치를 left 로 두어서 위젯+본문의 두개 컬럼으로 구성된다.
1
2
3
4
5
6
7
8
9
10
widgets:
-
type: recent_posts
position: left
-
type: categories
position: left
-
type: tags
position: left

Post/Page Front-matter

어떤 페이지/포스트에서 사이트/레이아웃 구성을 오버라이드 하려면 해당 포스트(글) 혹은 페이지의 Front-matter 로 구성해 사용하면 된다.

작성한 포스트 source/_post/some-post.md 에 선언한 Front-matter 구성.

1
2
3
4
5
6
7
8
title: My first post
date: '2015-01-01 00:00:01'
article:
highlight:
theme: atom-one-dark
---
# Some Post

some-post.md 의 Front-matter 는 아래 사항을 오버라이드한다.

  • _config.post.yml, _config.icarus.yml 의 article.highlight 를 atom-one-dark 로 재구성한다.
  • 단, font-matter에서 title, date, updated, comments, layout, source, photos, and excerpt 등은 재정의 되지 않는다.

Site Configuration File

앞서 설명한 icarus 테마, 레이아웃, font matter 파일을 사이트 구성파일을 재정의 한 것이다.



3. Upgrade

다른 버전의 icarus theme 로 업그레이드를 하려면 기존 폴더를 백업해 두고 다시 git clone을 통해 다운로드하고 _config.icarus.yml 구성 파일에 버전과 내용을 변경해서 사용하면 된다.

예를 들어 앞서 5.0.0 버전을 백업하고 5.1.1 버전으로 업그레이드 한다면 아래 같이 기존 irarus 를 icarus_5.0.0 같이 백업해 두고 새 버전이 잘 적응되는지 확인후 정리하면 된다.

1
2
$ cd PROJECT_FOLDER/theme
$ mv icarus icarus_5.0.0

이어서 새 버전을 git clone 한다.

1
$ git clone https://github.com/ppoffice/hexo-theme-icarus.git themes/icarus -b 5.1.1 --depth 1

hexo의 구성 파일 _config.icarus.yml 에 새 icarus 테마 버전을 명시한다.

1
version: 5.1.1

hexo 서버를 재시작해 정상적으로 동작하는지 확인한다. 그런데 필요한 npm 모듈 업그레이들 요구한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ hexo server
INFO Validating config
Inferno is in development mode.
INFO =======================================
██╗ ██████╗ █████╗ ██████╗ ██╗ ██╗███████╗
██║██╔════╝██╔══██╗██╔══██╗██║ ██║██╔════╝
██║██║ ███████║██████╔╝██║ ██║███████╗
██║██║ ██╔══██║██╔══██╗██║ ██║╚════██║
██║╚██████╗██║ ██║██║ ██║╚██████╔╝███████║
╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝
=============================================

ERROR Package hexo-component-inferno's version (1.1.0) does not satisfy the required version (^2.0.2).
ERROR Please install the missing dependencies your Hexo site root directory:
ERROR npm install --save hexo-component-inferno@^2.0.2
ERROR or:
ERROR yarn add hexo-component-inferno@^2.0.2

요구에 따라 업그레이드 해주면 된다.

1
$ npm install --save hexo-component-inferno@^2.0.2

정상적으로 업그레이드 되어서 server가 실행되는 것을 확인할 수 있다. 단, hexo clean 이후 에러를 만날 수 있어 보인다.


업그레이드 후 db.json 에러 대응

clean 해서 새로 생성하기 위해서 clean 명령후 generate 를 2번 정도 실행하면 보통는 db.json 에러가 없어지는데 업그레이드 후 아래 같이 계속 발생한다.

1
2
3
INFO  === Registering Hexo extensions ===
FATAL Error: [hexo-include-markdown] Could not open db.json .
at ReadFileContext.callback (/Users/qkboo/work-blog/thinkbee.github.io/node_modules/hexo-include-markdown/lib/orverwriteCache.js:22:15)

블로그 solved-hexo-include-markdown 를 따라 다음 같이 처리했다.

1
2
3
4
#
$ npm install hexo-include-markdown --save
# clean & generate
$ hexo clean;echo "{}" > db.json;hexo generate

Upgrade to Icarus 5.2.1

2023/7월 Icarus 5.2.1 로 업그레이드 진행

1
git clone https://github.com/ppoffice/hexo-theme-icarus.git icarus -b 5.2.1

_config.icarus.yml 에 icarus theme 버전을 명시한다.

1
version: 5.2.1

서버를 재시작하고 확인한다. npm 모듈등… 문제가 없이 잘 진행된다.

참고

  1. User guide: configurations

bitbuket 에 SSH key 등록하기

github, bitbucket 같은 클라우드 사이트에 Client 프로그램으로 SSH 접속을 위해서는 SSH 키 쌍 생성하고 클라우드 사이트에 등록해야 한다. 보통 github, bitbucket 등 같은 SSH 접근을 지원하는 사이트는 ssh-agent forwarding 방식을 사용한다.

  1. 클라이언트에서 ssh 키 쌍을 생성
  2. 클라이언트에 개인키를 ssh-agent 에 등록
  3. 클라우드 서비스에 공개키를 등록
  4. 클라이언트 프로그램에서 ssh 사용시 ssh-agent 등록한 개인키로 암호화

여기서는 bitbucket 을 예로 들고 있다.

과정은 bitbucket 을 예로 들었지만 github 도 유사한 과정을 거친다. github에서 Key 등록에 대해서는 링크를 참조한다. github 에 SSH key 등록하기


SSH 구성과 2단계 인증

Git Credential Manager (GCM) 를 git client 에서 bitbucket 에 접속해 사용하는데 이용할 수 있다. SSH 구성을 하지 않고 bitbucket 을 사용하려면 GCM 을 사용하면 된다. Git Credential Manager

단, GCM works over HTTPS, not SSH. 그래서 git clone https://{username}@bitbucket.org/{workspace}/{repository}.git 이렇게 요청해야 한다.

설명에 따라서 먼저 ssh host key 를 생성하고 bitbucket 에서 사용하는 개인용 ssh key 를 만든다. 이후 bitbucket 에 등록하면 된다.

SSH Client Keys

저장소에 접근하는 url은 HTTPS or SSH 에 따라 달라진다.

  1. HTTPS

https://<repo_owner>@bitbucket.org/<accountname>/<reponame>.git

  1. SSH

git@bitbucket.org:<repo_owner>/<reponame>.git

or

ssh://git@bitbucket.org/<repo_owner>/<reponame>.git

bitbucket은 암호 알고리즘으로 keys: Ed25519, ECDSA, RSA, and DSA 를 지원한다.

예를 들어 아래 같이 생성한 공개키를 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
#Ed25519 (ed25519) / 256
$ ssh-keygen -t ed25519 -b 256

# ECDSA (ecdsa) / 256
$ ssh-keygen -t ecdsa -b 256

# RSA (rsa) / 2048
$ ssh-keygen -t rsa -b 2048

# DSA / DSS (dsa) / 1024
$ ssh-keygen -t dsa -b 1024

SSH Host Key 생성

아래는 bitbucket 서버의 공개키 이다.

1
2
3
256 SHA256:FC73VB6C4OQLSCrjEayhMp9UMxS97caD/Yyi2bhW/J0 bitbucket.org (ECDSA)
256 SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM bitbucket.org (ED25519)
2048 SHA256:46OSHA1Rmj8E8ERTC6xkNcmGOw9oFxYr0WF6zWW8l1E bitbucket.org (RSA)

해당 공개키가 적적할지 확인은 다음 같이 curl 로 테스트해볼 수 있다.

1
curl https://bitbucket.org/site/ssh

개별키 생성

ssh 를 사용해서 bitbucket 클라우드에 접근하려면 사용하는 클라이언트에서 SSH 로 개인키와 공개키를 생성해야 한다. SSH 키를 생성하려면 아래 과정이 필요하다.

  1. Open SSH 설치
  2. SSH 서비스
  3. SSH 키 생성

여기서 Linux/macOS 그리고 Windows 11 에서 키 쌍을 생성해서 bitbucket에 등록하는 과정을 살펴보겠다.


Windows 11에서 키 생성

Windows 11 에서 Git 이 설치되어 있다고 가정.

1
2
3
> get-command git

Application git.exe 2.38.1.1 C:\Program Files\Git\cmd\git.exe

Openssh 확인

1
2
> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

ssh 명령 위치 확인

1
> Get-Command ssh

결과 ssh 명령을 git config 로 ssh 명령을 지정

1
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe

SSH agent 시작

git 이 ssh 키를 사용하려면 SSH agent 가 시작되어야 한다. 보통 Git for windows 와 Windows 11 이후 Windows OpenSSH 를 사용하므로

Windows OpenSSH 사용자는 다음 같이 agent를 확인하고 시작한다.

1
2
3
4
5
> Get-Service ssh-agent

Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent

ssh-agent 서비스를 시작 하려면 Windows service에서 OpenSSH Authenticate Agent 서비스를 시작해 두어야 한다.

속성에서 시작으로 한다.

서비스가 정상적으로 시작되면 아래 명령으로 시작/종료 그리고 재시작을 할 수 있다. - 시작 안되어 있으면 알수없는 에러가 난다.

1
> Start-Service ssh-agent

Git for windows 를 사용하면 Git for windows의 bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

bitbucket에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다. 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다. 생성시 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.

1
> ssh-keygen.exe -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
9
10
> dir .ssh

Directory: C:\Users\daddy\.ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
> ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host bitbucket.org
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

macOS / Linux

Openssh 확인

1
2
$ ssh -V
OpenSSH_8.2p1 macOS, OpenSSL 1.1.1f 31 Mar 2020

ssh 명령이 없으면 macOS는 brew 로 설치한다.

1
$ brew install openssh

Linux 는 apt, dnf, pacman 을 사용해 설치한다.

1
$ sudo apt update && sudo apt install openssh-client

SSH agent 시작

git 에서 ssh 키를 사용하려면 SSH agent 가 시작한다. bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

이 명령을 ~/.bashrc, ~/.zshrc, ~/.profile, 등에 등록해 둔다. 에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

bitbucket에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다.

  • 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다.
  • 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.
1
$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
$ ls -l .ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키 쌍를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
$ ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host bitbucket.org
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

Bitbucket Cloud with your public key

bitbucket 을 위해 생성한 키 쌍에서 공개키 KEY_FILE.pub 를 bitbucket 의 계정에 등록해 주어야 한다.

  1. Settings -> Personal Settings
  1. Secutiry -> SSH Keys -> Add key

생성한 키 쌍에서 bitbucket_work.pub 같이 공개키를 등록하는데, 공개키 파일 내용을 복사해 붙여넣기를 하면 된다.

cat 명령 등으로 내용을 복사한다.

1
2
3
4
5
> cat .\.ssh\bitbucket_work.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDo+7VGfxlhxFsy0Edu+PPmqngJVzwLQuLPanOi5x8t2yu7RmFNlEfU32AgA7vkoLno98XFZaUZ3ZjMwVu7LWeLMNczx5nH//
...
...
+v7ttamzvFe8idOtCjJszG5l8rn4poIN2E24AWGvCGbzs55WRXY/amYEqP5/maH0NT+pYM2ZMV7Nt8Jb86iQ== james@thinkbee.kr

사이트의 Add key 창에 붙여 넣는다.

이제 새 SSH 키가 등록되었다.

클라이언트에서 bitbucket 에 SSH 접속이 가능한지 테스트한다. 단, 모든 SSH 연결은 최초 접속시 호스트 접속 여부를 묻는다. 아래 같이 bitbucket.org 접속시 접속 여부를 묻는 다이얼로그가 나온다.

1
2
3
4
5
6
7
8
9
$ ssh -T git@bitbucket.org
The authenticity of host 'bitbucket.org (104.192.141.1)' can't be established.
ED25519 key fingerprint is SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'bitbucket.org' (ED25519) to the list of known hosts.
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled

결과적으로 아래 같이 결과가 출력되면 성공한 상태다.

1
2
3
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled

이제 git 클라이언트에서 HTTPS, SSH 를 통해서 bitbucket 과 ssh 연결이 가능하다. git 클라이언트로 push, pull 등을 수행할 수 있다.


참고

  1. https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/
  2. github 에 SSH key 등록하기

github 에 SSH key 등록하기

github, bitbucket 같은 클라우드 사이트에 Client 프로그램으로 SSH 접속을 위해서는 SSH 키 쌍 생성하고 클라우드 사이트에 등록해야 한다.

보통 github, bitbucket 등 같은 SSH 접근을 지원하는 사이트는 ssh-agent forwarding 방식을 사용한다.

  1. 클라이언트에서 ssh 키 쌍을 생성
  2. 클라이언트에 개인키를 ssh-agent 에 등록
  3. 클라우드 서비스에 공개키를 등록
  4. 클라이언트 프로그램에서 ssh 사용시 ssh-agent 등록한 개인키로 암호화

여기서는 github 에 ssh key 등록 과정을 요약하고 있다.


SSH 구성과 SSH 인증

먼저 ssh host key 를 생성하고 github 과 사용할 개인 key 를 만든다. 개인키를 ssh-agent 방식으로 등록하고 공개키를 github 에 등록하면 된다.

ssh-agent 키 관리

로컬 머신에서 사용하는 SSH Key 쌍에 대한 접근을 ssh-agent 를 통해서 진행한다. managing deploy keys 에 설명되어 있다.

  • 에이전트 전달은 로컬 개발 컴퓨터에서 사용하는 것과 동일한 SSH 키를 사용합니다.
  • 단 사용자 클라이언트에 SSH에 있어야 합니다

SSH Client Keys

저장소에 접근하는 url은 HTTPS or SSH 에 따라 달라진다.

  1. HTTPS

https://<repo_owner>@github.com/<accountname>/<reponame>.git

  1. SSH

git@github.com:<repo_owner>/<reponame>.git

or

ssh://git@github.com/<repo_owner>/<reponame>.git

github은 암호 알고리즘으로 keys: Ed25519, ECDSA, RSA, and DSA 를 지원한다.

예를 들어 아래 같이 생성한 공개키를 사용할 수 있다.

1
2
3
4
5
6
7
8
#Ed25519 (ed25519) / 256
$ ssh-keygen -t ed25519 -b 256

# ECDSA (ecdsa) / 256
$ ssh-keygen -t ecdsa -b 256

# RSA (rsa) / 2048
$ ssh-keygen -t rsa -b 4096

개별키 생성

ssh 를 사용해서 github 에 접근하려면 사용하는 클라이언트에서 SSH 로 개인키와 공개키를 생성해야 한다. SSH 키를 생성하려면 아래 과정이 필요하다.

  1. Open SSH 설치
  2. SSH 서비스
  3. SSH 키 생성

여기서 Linux/macOS 그리고 Windows 11 에서 키 쌍을 생성해서 github에 SSH Key를 등록하는 과정을 살펴보겠다.


Windows 11에서 키 생성

Windows 11 에서 Git 이 설치되어 있다고 가정.

1
2
3
> get-command git

Application git.exe 2.38.1.1 C:\Program Files\Git\cmd\git.exe

Openssh 확인

1
2
> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

ssh 명령 위치 확인

1
> Get-Command ssh

결과 ssh 명령을 git config 로 ssh 명령을 지정

1
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe

SSH agent 시작

git 이 ssh 키를 사용하려면 SSH agent 가 시작되어야 한다. 보통 Git for windows 와 Windows 11 이후 Windows OpenSSH 를 사용하므로

Windows OpenSSH 사용자는 다음 같이 agent를 확인하고 시작한다.

1
2
3
4
5
> Get-Service ssh-agent

Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent

ssh-agent 서비스를 시작 하려면 Windows service에서 OpenSSH Authenticate Agent 서비스를 시작해 두어야 한다.

속성에서 시작으로 한다.

서비스가 정상적으로 시작되면 아래 명령으로 시작/종료 그리고 재시작을 할 수 있다. - 시작 안되어 있으면 알수없는 에러가 난다.

1
> Start-Service ssh-agent

Git for windows 를 사용하면 Git for windows의 bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

github에서 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다. 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다. 생성시 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.

1
> ssh-keygen.exe -t ed25519  -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: github 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

참고: Ed25519 알고리즘을 지원하지 않는 레거시 시스템을 사용하는 경우 다음을 사용합니다.

1
>$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
9
10
> dir .ssh

Directory: C:\Users\daddy\.ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
> ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 github 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

macOS / Linux

Openssh 확인

1
2
$ ssh -V
OpenSSH_8.2p1 macOS, OpenSSL 1.1.1f 31 Mar 2020

ssh 명령이 없으면 macOS는 brew 로 설치한다.

1
$ brew install openssh

Linux 는 apt, dnf, pacman 을 사용해 설치한다.

1
$ sudo apt update && sudo apt install openssh-client

SSH agent 시작

git 에서 ssh 키를 사용하려면 SSH agent 가 시작한다. bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

이 명령을 ~/.bashrc, ~/.zshrc, ~/.profile, 등에 등록해 둔다. 에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

github에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다.

  • 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다.
  • 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.
1
$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

참고: Ed25519 알고리즘을 지원하지 않는 레거시 시스템을 사용하는 경우 다음을 사용합니다.

1
>$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
$ ls -l .ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키 쌍를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
$ ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

github 에 public key 등록하기

github 계정의 SSH and GPG keys에서 등록해 주어야 한다. 키 쌍 중 공개키 KEY_FILE.pub 내용을 등록해 준다.

  1. Settings -> Personal Settings
' >

cat 명령 등으로 내용을 복사한다. 사이트의 Add key 창에 붙여 넣는다.

클라이언트에서 github SSH 접속이 가능한지 테스트한다. 단, 모든 SSH 연결은 최초 접속시 호스트 접속시 접속 여부를 묻는 다이얼로그가 나온다.

결과적으로 아래 같이 결과가 출력되면 성공한 상태다.

1
2
3
$ $ ssh -T git@github.com

Hi USER! You've successfully authenticated, but GitHub does not provide shell access.

이제 git 클라이언트에서 HTTPS, SSH 를 통해서 github 과 ssh 연결이 가능하다. git 클라이언트로 push, pull 등을 수행할 수 있다.


참고

  1. Connect with SSH, github
  2. SSH 연결 테스트, github
  3. bitbucket 에 SSH key 등록하기

[git] Sparse Checkout

git checkout 은 보통 브랜치의 모든 구조를 가져온다. checkout 은 다음 링크 설명을 보고 이해해 보자,

Sparse checkout 은 checkout 전체 대상중 일부 만을 checkout 할 수 있다.

git sparse checkout 기능은 Git 2.25.0 이상부터 사용이 가능하다.

Sparse checkout 이해

git 블로그 글 Bring your monorepo down to size with sparse-checkout 의 그림 설명을 빌려오자.

다음 원격 레포지토리가 있다고 가정하자

전체 디렉토리 중에서 client/android 부분만 checkout 을 하고 싶다.

다음 같이 클론을 하고 sparse-checkout 을 초기화 한 후에 대상인 client/android 디렉토리를 sparse-checkout 하면 해당 디렉토리만 다운로드한다.

1
2
3
4
git clone https://github.com/tensorflow/examples.git
cd examples
git sparse-checkout init --cone
git sparse-checkout set client/android

sparse-checkout 을 수행하면 해당 디렉토리 컨텐츠만 남게 된다.

사용 방법

사용시 몇가지 사례가 있다.

방법1

첫번째 방법으로 git 레포지토리를 pull로 clone 한 후에 sparse-checkout 대상 파일/폴더를 지정하고 sparse-checkout 을 수행한다.

1
git clone https://github.com/tensorflow/examples.git

spase-checkout 을 수행하기 위해서 초기화 하고 대상이 되는 파일/폴더를 지정한다.

1
2
3
4
cd examples
git config core.sparseCheckout true
git sparse-checkout set lite/examples/object_detection/android_play_services
git pull origin master

희소 체크아웃을 사용하도록 git 인스턴스를 구성하면 지정한 파일/폴더만 남게 된다.

저장소에서 config core.sparseCheckout true 대신 git sparse-checkout init --cone 를 이용해도 된다.

방법2

레포지토리를 클론하지 않고 클라이언트에서 초기화 후 sparse-checkout 으로 대상 디렉토리를 지정한 후에 pull 을 수행한다.

원격 레포지토리를 지정한다.

1
2
3
4
mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

spase-checkout 을 수행하기 위해서 초기화 하고 대상이 되는 파일/폴더를 set 으로 지정한다. 여러 파일/디렉토리를 추가할 수 있다.

1
2
git config core.sparseCheckout true
git sparse-checkout set lite/examples/object_detection/android

pull 을 수행한다.

1
2
3
4
git pull origin master
From https://github.com/tensorflow/examples
* branch master -> FETCH_HEAD
Updating files: 100% (61/61), done.

저장소에서 config core.sparseCheckout true 대신 git sparse-checkout init --cone 를 이용해도 된다.

방법3

방법2와 동일하지만 설정 파일을 통해서 수행하는 점만 다르다.

1
2
3
4
mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

원격 레포지토리를 지정하고 git 설정에 추가한다.

1
git config core.sparseCheckout true

checkout 하려는 파일과 폴더를 sparse-checkout 파일에 추가한다. 여러 파일/디렉토리를 추가할 수 있다.

1
2
echo "lite/examples/object_detection/android" >> .git/info/sparse-checkout
echo "lite/examples/bert_qa/android" >> .git/info/sparse-checkout

pull 을 수행한다.

1
git pull origin master

함께 보면 유용한 git 명령

간단하게 빌드/테스트 를 하기위해 저장소의 특정 폴더만 clone 할 때 Swallow Clone 을 함께 이용해도 좋을 것 이다.

[git] Swallow clone



- 참고

Hexo: icarus 테마 git기반 설치와 업그레이드


2023-07-09에 작성한 Hexo - icarus theme 설치: git기반 가 최신 글이다.


Hexo 의 테마인 icarus 를 git 을 통해 설치하고 원하는 버전으로 업그레이드 하는 과정을 살펴본다.

  1. Icarus theme git 설치
  2. Upgrade

1. Icarus theme git 설치

icarus 테마는 getting-started-with-icarus 에 설명이 되어 있다. 여기서는 git 을 클론해서 사용해 보도록 하겠다.


- git clone

icarus 릴리즈 페이지 https://github.com/ppoffice/hexo-theme-icarus/releases 를 확인해서 원하는 버전 번호를 찾는다. hexo 프로젝트 폴더에 들어가서 아래 같이 5.0.0 버전을 지정해서 클론을 수행한다.

1
2
$ cd PROJECT_FOLDER
$ git clone https://github.com/ppoffice/hexo-theme-icarus.git themes/icarus -b 5.0.0 --depth 1

클론한 결과는 아래 같은 폴더 구조를 갖는다.

1
2
3
4
5
6
themes/icarus
├── include
├── languages
├── layout
├── scripts
└── source

- 설정

이제 hexo의 구성 파일 _config.yml 에 테마를 icarus 로 지정한다.

1
2
#_config.yml
theme: icarus

그리고 icarus 구성 파일 _config.icarus.yml 에 먼저 버전을 명시하고 icarus 테마 관련 설정을 진행한다.

1
version: 5.0.0


2. Upgrade

다른 버전의 icarus theme 로 업그레이드를 하려면 기존 폴더를 백업해 두고 다시 git clone을 통해 다운로드하고 _config.icarus.yml 구성 파일에 버전과 내용을 변경해서 사용하면 된다.

예를 들어 앞서 5.0.0 버전을 백업하고 5.1.1 버전으로 업그레이드 한다면 아래 같이 기존 irarus 를 icarus_5.0.0 같이 백업해 두고 새 버전이 잘 적응되는지 확인후 정리하면 된다.

1
2
$ cd PROJECT_FOLDER/theme
$ mv icarus icarus_5.0.0

이어서 새 버전을 git clone 한다.

1
$ git clone https://github.com/ppoffice/hexo-theme-icarus.git themes/icarus -b 5.1.1 --depth 1

hexo의 구성 파일 _config.icarus.yml 에 새 icarus 테마 버전을 명시한다.

1
version: 5.1.1

hexo 서버를 재시작해 정상적으로 동작하는지 확인한다. 그런데 필요한 npm 모듈 업그레이들 요구한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ hexo server
INFO Validating config
Inferno is in development mode.
INFO =======================================
██╗ ██████╗ █████╗ ██████╗ ██╗ ██╗███████╗
██║██╔════╝██╔══██╗██╔══██╗██║ ██║██╔════╝
██║██║ ███████║██████╔╝██║ ██║███████╗
██║██║ ██╔══██║██╔══██╗██║ ██║╚════██║
██║╚██████╗██║ ██║██║ ██║╚██████╔╝███████║
╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝
=============================================

ERROR Package hexo-component-inferno's version (1.1.0) does not satisfy the required version (^2.0.2).
ERROR Please install the missing dependencies your Hexo site root directory:
ERROR npm install --save hexo-component-inferno@^2.0.2
ERROR or:
ERROR yarn add hexo-component-inferno@^2.0.2

요구에 따라 업그레이드 해주면 된다.

1
$ npm install --save hexo-component-inferno@^2.0.2

정상적으로 업그레이드 되어서 server가 실행되는 것을 확인할 수 있다. 단, hexo clean 이후 에러를 만날 수 있어 보인다.


업그레이드 후 db.json 에러 대응

clean 해서 새로 생성하기 위해서 clean 명령후 generate 를 2번 정도 실행하면 보통는 db.json 에러가 없어지는데 업그레이드 후 아래 같이 계속 발생한다.

1
2
3
INFO  === Registering Hexo extensions ===
FATAL Error: [hexo-include-markdown] Could not open db.json .
at ReadFileContext.callback (/Users/qkboo/work-blog/thinkbee.github.io/node_modules/hexo-include-markdown/lib/orverwriteCache.js:22:15)

블로그 solved-hexo-include-markdown 를 따라 다음 같이 처리했다.

1
2
3
4
#
$ npm install hexo-include-markdown --save
# clean & generate
$ hexo clean;echo "{}" > db.json;hexo generate

github 의 Profile README 이용

Profile README

깃헙 레포지토리를 깃헙 사용자 이름과 동일하게 생성하고 README.md 를 추가하면 프로필 리드미로 사용할 수 있다.

https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/managing-your-profile-readme

  1. 사용자 이름과 같은 레포지토리를 생성하고 README.md 를 추가

사용자에 대한 설명을 적은 README.md

  1. 이렇게 추가한 프로필 README 는 Overview 에 나타나게 된다.

github 레포지토리에 collaborator 추가하고 머지하기

프로젝트를 위해서 레포지토리에 새 참여자를 추가하고, 브랜치를 생성해서 관리하는 과정.

참여자 관리

레포지토리 Settings 에서 Collaborators 페이지에서 참여자를 관리할 수 있다.

Collaborator 에 추가할 github 사용자를 검색

Collaborators 추가 사용자 목록

사용자는 알림에 Collaborator 에 추가되어 허용할지를 등록

요청받은 collaborator 을 받아들인다

Collaborator 사용자가 새로운 파일을 추가한다.

<img src=’https://i.imgur.com/2i1UOyD.png>

레포지토리 브랜치의 새로운 변경/추가/삭제가 발생하면 Pull request 를 요청해야 한다.

Collaborator로 참가한 사용자는 pull request 하고 merge도 할 수 있지만 정책으로 main 관리자가 하도록 하자.

새 브랜치 사용

pull request 와 merge 를 위한 정책 구성. Collaborator도 merge 할 수 있지만 팀장/관리자가 merge 하도록 정책을 정한다.

Pull request 와 merge

새 브랜치를 생성한다

새 브랜치에서 작업을 수행한다.

새 브랜치에 변경된 내용을 pull request 할 수 있다.

새 브랜치에 변경된 내용을 pull request 할 수 있다.

사용자/관리자는 새 브랜치에 변경된 내용을 pull request 할 수 있다.

관리자/팀장은 새 브랜치에 변경된 내용을 merge 한다.

관리자/팀장은 새 브랜치에 변경된 내용을 merge 한다.

관리자/팀장은 사용한 브랜치는 제거해 레포지토리를 정리한다.