들어가기 전에
Work Tree: 한 레포지토리 내의 각각의 브렌치
Index: 작업 트리와 저장소 사이에 존재하는 staging area 공간
git
git_add
git-add: add file contents to the index
- working tree에 존재하는 현재 컨텐츠를 이용해 인덱스를 업데이트함
- 다음 커밋을 위해 컨텐츠를 준비하는 과정
- 주로 존재하는 경로의 현재 컨테츠를 통째로 추가하지만, 옵션을 이용해 부분적으로 컨텐츠를 추가하거나 working tree에 더이상 존재하지 않는 경로를 삭제할 수 있음
- 하나의 커밋 전에 여러번 사용할 수 있는 커멘드임
git add .
- 현재 디렉토리의 모든 변경 내용을 스테이징 영역으로 넘김
git add -A
- 작업 디렉토리 내 모든 변경 내용을 스테이징 영역으로 넘김
git add -p
- 각 변경사항을 터미널에서 하나씩 확인해 스테이징 영역으로 넘기거나 제외
git_commit
git-commit: record changes to the repository
- 인덱스의 현재 컨텐츠를 포함하는 커밋을 만들고, 이 변화를 설명하는 로그 메시지를 남김
- 새 커밋은 HEAD의 직속 자식이며, 주로 브랜치의 끝으로 존재
- 주로 브랜치는 자신의 끝인 새 커밋을 가리키도록 업데이트됨
컨텐츠는 다양한 방법으로 커밋될 수 있다
- 커밋 커멘드를 사용하기 전에
git-add
을 이용해 인덱스에 변화를 점진적으로 추가한다
- 커밋 커멘드를 사용하기 전에
git-rm
을 이용해 working tree와 인덱스로부터 파일을 삭제한다
- 파일을 커밋 커멘드의 인수로 리스트해 커밋이 오직 리스트된 파일들의 현재 컨텐츠만 기록하도록 한다
- 커밋 커멘드에
-a
스위치를 사용하여 인덱스에 존재하는 모든 파일의 변화를 자동으로 기록하고 작업 트리에서 삭제된 인덱스의 모든 파일을 지운 후 커밋을 실행한다
- 커밋 커멘드에
--interactive
또는 --patch
스위치를 사용해 어느 변화를 기록할지 개별적으로 지정한다
git_push
git-push: 로컬 저장소의 코드 변경 이력을 원격 저장소로 전송하여 업데이트
- 주어진 ref를 완성하기 위해 필요한 오브젝트도 같이 보냄
- 커멘드에 어디로 커밋들을 푸쉬할지 명시하지 않으면 현재 브랜치의
branch.*.remote
설정이 어디로 푸쉬할지 결정한다
remote
git-remote: manage set of tracked repositories
- 원격 저장소를 관리할 수 있음
git remote add origin (url)
로 origin이라는 이름의 원격 저장소 주소를 등록할 수 있음
git_hook
Hook: hooks 디렉토리에 위치할 수 있는 프로그램으로 git 수행 과정 중 특정 이벤트에 특정 스크립트를 실행 시킴
- 클라이언트 훅과 서버 훅으로 나뉨
- 클라이언트 훅: 커밋/merge 때 실행
- 서버 훅: push할 때 서버에서 실행
- 훅 설치
- git 디렉토리 밑 hooks 디렉토리에 저장 (
.git/hooks
)
- 훅 파일이 정상 종료되지 않으면 해당 깃 액션도 취소됨
pre_commit
훅의 종류
- 커밋할 때 가장 먼저 호출되는 훅
- 커밋 메시지를 작성하기 전에 호출함
- 이 훅에서 커밋하는 snapshot을 점검함: 빠트린 겂은 없는지, 테스트는 확실히 했는지 등
- 이 훅의 exit 코드가 0이 아니면 커밋 취소
- 이 훅을 생락하기 위해서는:
git commit --no-verify
실행
pre_push
훅의 종류
git push
커멘드 실행시 동작
- 동작 시점: remote 정보 업데이트 후. remote로 데이터 전송하기 전
- remote의 이름과 주소를 인자로 받아
stdin
을 통해 업데이트할 해시 리스트를 전달받음
- 용도: 푸쉬하기 전 커밋이 유효한지 확인함
- 0이 아닌 값 반환시 푸쉬 중지
.git
git init
커멘드 실행시 만들어지는 디렉토리
- 데이터를 저장하고 관리하는 디렉토리
- 새로 저장소를 만들었을 때
.git
의 디렉토리 구조
- config: 해당 프로젝트에만 적용되는 설정 옵션
- description: GitWeb 프로그램에서만 쓰니 신경쓰지 않아도됨
- HEAD: 현재 checkout한 브랜치 가리킴
- hooks/: 클라이언트/서버 훅 위치
- info/: 무시할 파일의 패턴
- vs.
.gitignore
: info/는 깃으로 관리되지 않음
- objects/: 모든 컨텐츠를 저장하는 데이터베이스
- refs/: 커밋 객체의 포인터 (브랜치/태그/리모트 등) 저장
- 기본적으로 git ignore 대상임
shell script
shell: 명령어를 실행하는 마크로프로세서
- 마크로프로세서: 텍스트와 심볼이 더 큰 표현을 위해 확장됨
shell script: unix 커멘드 등을 나열해서 실행
- 언제 어떤 조건으로 어떠한 명령을 실행시킬 것인가
- 파일을 컨텐츠를 읽어들일 것인가
- 로그 파일을 작성
ls
디렉토리의 내용 확인
디렉토리 내에 존재하는 파일 등을 보여줌
pwd
현재 디렉토리 위치 출력
cd
디렉토리 변경 명령어
cd .
- 현재 디렉토리
cd ..
- 한단계 상위 디렉토리로 이동
cd /
- 최상위 디렉토리로 이동
cd $변수
- 변수에 저장된 경로로 이동
등
sudo
Sudo: SuperUser Do
- 제한된 파일/연산 등에 접근하기 위해 사용
- 다른 사용자로 커멘드 실행
sudo -u
- 명시한 유저이름/id로 명령어 실행
sudo -h
- help. 도움말
sudo -l
- 유저의 권한 리스트
sudo -k
- sudo 권한 끝내기
vi
Vi: 에디터
vi <파일명>
- 파일 열기, 작성
vi +<행번호><파일명>
- 파일을 열어 입력한 행으로 이동
vi -r <파일명>
- 손상된 파일 회복
vim
vim - 텍스트 에디터
- Vi IMproved의 약자: Vi에 기능 추가한 버전
- 대부분의 리눅스 체계에서 사용
vim에는 있지만 vi에 없는 기능
- multi-level undo
- Vi는
u
명령어로 한번에 한 레벨의 undo만 가능함
- Vim은
undolevels
옵션으로 최대 1000개 변경사항까지 한번에 undo할 수 있음
ctrl+r
로 redo도 가능
- 변경사항은 undo-tree에 들어가 텍스트 손실을 방지함
- tabs, multiple windows, and buffers
- Vim: 파일들을 여러 분리된 창에 볼 수 있음. 탭으로 모아서 볼수도 있음
- 분리된 창:
-o
(horizontal split), -O
(vertical split)
- (ex)
vim -O file1.txt file2.txt
- flexible insert mode
- Vi를 insert mode를 사용하면
Esc
와 i
/a
를 사용하지 않으면 커서를 움직일 수 없음
- Vim은 arrow key로 insert mode 중에도 파일을 돌아다닐 수 있음
- Macros
- Vim에서는 macros가 가능함
- 여러 커멘드를 기록해 원하는만큼 반복할 수 있음
- Visual mode
- Vim: 하이라이팅 표시가 포함된 비주얼 모드가 존재됨
- 하이라이팅: 하이라이팅된 섹션에만 연산 가능
- Command-line completion
- Vi: command line completion 없음
- Vim:
tab
키로 커멘드/파일명/옵션 자동완성 가능
등
bash
Bourne Again SHell: sh-compatible shell
- application: starts w/ prompt that waits for your input
- also a command: default command executed when you open a terminal window/log into a text console
- has built-in commands (i.e., cd) and has access to specific directories in system with commands
echo <현재 프로세스명>
command - check if you're running n Bash shell
zsh
- aka z shell
- interactive login shell built on top of Bash
- extension of Bourne Shell w/ new features
- features
- automatic cd: just type the name of directory
- spelling correction & approx completion
- etc.
- compared to bash, zsh:
- more interactive & customizable
- supports hash data structures
- better invocation features
install: brew install zsh
chsh
chsh: command that changes a user's login shell attribute
- shell attribute: defines initial program that runs after a user logs into the system
- specified in
/etc/passwd
file
- (by default) changes the login shell for the user who gives command
- interactive:
- (1) when you run this command, system displays a list of available shells & current value of the shell attribute
- (2) system prompts you to change the shell
- (3) you have to input full path name of available shell
.bashrc
- 유저가 로그인할 때 실행되는 스크립트 파일
- 이미 로그인한 상태에서 새 터미널 창을 열때마다도 로드됨
- 터미널 환경 설정, 커멘드 목록 등을 포함
- 숨겨진 파일이라 기본적인
ls
명령어로는 보이지 않음
.bashrc
파일을 수정해 함수 정의, 커멘드 가명, bash 커스터마이징 등 할 수 있음
- 함수 정의:
vi .bashrc
: .bashrc
파일을 수정 모드로 염
- 함수 정의 추가
ESC
로 수정 모드 나가고 :wq
입력후 엔터로 vi 저장후 exit
- 터머널을 재시작하거나
source .bashrc
한 후에 함수 호출 가능
- 커멘드 가명: 긴 형식의 커멘드를 단순화
alias wmi='whoami
와 같이 단순화된 이름으로 호출 가능
source .bashrc
후에 함수 호출 가능
.zshrc
- zsh shell에서 실행할 커멘드 목록을 포함하는 환경설정 파일
- bash shell을 위한
.bashrc
파일의 역할과 동일
- interactive zsh session이 시작되면 스크립트는 바로 실행됨
- hidden file
- automatically created when zsh shell is instaled
source
configuration 파일을 reload하는 명령어
configuration 파일에 변경사항이 있으면 이를 반영하는데 사용
.profile
- 로그인할 때 로드되는 시스템 전체 환경 설정 파일
- 전역적인 시스템 설정과 관련된 파일
chmod
시스템의 파일의 권한을 변경하는 명령어: change + mode
- mode: 권한(읽기/쓰기/실행)과 각 권한을 지정할 대상(파일소유자/그룹/그외)
- 읽기: r, 쓰기: w, 실행: x, 소유자: user, 그룹: group, 그외: others
chmod [OPTION] [MODE] [FILE]
- 옵션
-v
- 모든 파일에 대해 모드가 적용되는 진단 메시지 출력
-f
- 에러 메시지 출력안함
-c
- 기존 파일 모드가 변경되는 경우에만 진단 메시지 출력
-R
- 재귀적으로 모든 하위 폴더까지 변경
- 모드: 파일에 적용할 모드 문자열 조합
- u, g, o, a
- u: 소유자, g: 그룹, o: 그외, a: 모든 사용자 지정
- +, -, =
- +: 현재 모드에 대한 권한 추가
- -: 현재 모드에서 권한 제거
- =: 현재 모드로 권한 지정
- r, w, x
- r: 읽기 권한, w: 쓰기 권한, x: 실행 권한
- s: 실행시 사용자/그룹ID 지정
chown
파일의 소유자를 소유자가 지정한 사용자ID/프로필로 변경하는 명령어
파일의 소유자를 변경하려면 너가 루트 유저여야 함
파일의 그룹을 변경하려면 다음 권한 중 하나가 있어야함:
- 너가 루트 유저임
- 너가 파일의 소유자임
- 루트 유저가 아니고 이 경우일 때는 그룹을 변경하려면 너가 속한 그룹으로만 변경할 수 있음
chown [OPTIONS] USER[:GROUP] FILE(s)
- 소유자는 필수. 소유자그룹은 선택사항
ls -l
- 파일의 소유자 출력
- 플래그 관계
-H
, -L
, -P
: mutually exclusive
- specifying more than one is not considered an error BUT only last flag determines behavior
-h
flag: changes ownership of encountered symbolic link (not that of file/directory pointed by link`
- if symbolic link is encountered & you didn't specify
-h
flag, chown command changes the ownership of file/directory pointed by the link (not the ownership of the link itself)
- if you did specify
-h
, chown will change the ownership of the link itself (not that of file/directory pointed by link)
-R
- chown command recursively descends spceified directories
-f
- suppresses all error messages
-L
- if -R
option is specified & symbolic link refering a file of type directory is specified on command line or encountered during traversal of file hiearchy, chown shall change user id (& group idi if specified) of directory referenced by symbolic link & all files in the file hierarchy below
-P
- if -R
option is specified & symbolic link is specified on command line/encountered during traversal of file hierarchy, chown shall change owner ID of symbolic link if system suporst this operation
- Exit status
0
- command executed successfully & changes made
> 0
- error
ln
파일의 link를 설정하는 명령어
ln -s <대상 원본 파일> <새로 만들 파일명>
심볼릭 링크 해제: rm <링크 파일>
Symbolic link (Soft link)
Symbolic link: 링크를 연결해 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크
- 특정 폴더에 링크를 걸어 원본 파일을 사용하기 위해 사용
- 용도: 파일이 디렉토리 A에 존재하는데 프로그램을 사용하려면 파일이 디렉토리 B에 위치해야 할 때 등
- 바로가기와 유사
- 어떤 파일 시스템에서든 이미 생성되어 있는 다른 파일/디렉토리로 redirect
- 디렉토리/파일에 사용 가능
- 연결되어있는 파일 찾기 쉬움
- 존재하지 않는 파일에 대해 작성 가능
Hard link: 파일이 심볼릭 링크 위치에 실제로 존재하는 것처럼 만듬
ln <파일명> <만들 파일명>
- inode 번호에 직접 연결되어 만들어짐
- 원본 파일의 inode을 공유하고 이름만 다른 파일이 생성됨
- 파일 경로가 다르면 이름 같게 생성 가능
- 이름을 제외한 모든 속성이 같음
- 링크된 파일의 속성이 바뀌면 다른 파일도 속성이 함게 변경됨
- 삭제
- 하드 링크가 삭제되면 링크도 사라짐
- 파일 내용은 그 파일의 모든 링크가 삭제될때까지 남아있음
- 장점
- 단점
- 같은 파일 시스템 내에서만 사용 가능
- 디렉토리 참조 불가
- 구분할 수 없는게 단점이 될 수도 있음
references: