Git과 Shell Script

지니🧸·2023년 4월 14일
0

GDSC

목록 보기
1/12

들어가기 전에

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의 직속 자식이며, 주로 브랜치의 끝으로 존재
    • 주로 브랜치는 자신의 끝인 새 커밋을 가리키도록 업데이트됨

컨텐츠는 다양한 방법으로 커밋될 수 있다

  1. 커밋 커멘드를 사용하기 전에 git-add을 이용해 인덱스에 변화를 점진적으로 추가한다
  2. 커밋 커멘드를 사용하기 전에 git-rm을 이용해 working tree와 인덱스로부터 파일을 삭제한다
  3. 파일을 커밋 커멘드의 인수로 리스트해 커밋이 오직 리스트된 파일들의 현재 컨텐츠만 기록하도록 한다
  4. 커밋 커멘드에 -a 스위치를 사용하여 인덱스에 존재하는 모든 파일의 변화를 자동으로 기록하고 작업 트리에서 삭제된 인덱스의 모든 파일을 지운 후 커밋을 실행한다
  5. 커밋 커멘드에 --interactive 또는 --patch 스위치를 사용해 어느 변화를 기록할지 개별적으로 지정한다

git_push

git-push: 로컬 저장소의 코드 변경 이력을 원격 저장소로 전송하여 업데이트

  • 주어진 ref를 완성하기 위해 필요한 오브젝트도 같이 보냄
  • 커멘드에 어디로 커밋들을 푸쉬할지 명시하지 않으면 현재 브랜치의 branch.*.remote 설정이 어디로 푸쉬할지 결정한다
    • 설정이 없으면 디폴트로 origin

remote

git-remote: manage set of tracked repositories

  • 원격 저장소를 관리할 수 있음
  • git remote add origin (url)로 origin이라는 이름의 원격 저장소 주소를 등록할 수 있음
    • 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를 사용하면 Esci/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
    • has improvements to Bash
  • 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 명령어로는 보이지 않음
    • ls -a로 하면 보임
  • .bashrc 파일을 수정해 함수 정의, 커멘드 가명, bash 커스터마이징 등 할 수 있음
    • 함수 정의:
        1. vi .bashrc: .bashrc 파일을 수정 모드로 염
        1. 함수 정의 추가
        1. ESC로 수정 모드 나가고 :wq 입력후 엔터로 vi 저장후 exit
        1. 터머널을 재시작하거나 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: 링크를 연결해 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크

  • 특정 폴더에 링크를 걸어 원본 파일을 사용하기 위해 사용
  • 용도: 파일이 디렉토리 A에 존재하는데 프로그램을 사용하려면 파일이 디렉토리 B에 위치해야 할 때 등
  • 바로가기와 유사
  • 어떤 파일 시스템에서든 이미 생성되어 있는 다른 파일/디렉토리로 redirect
  • 디렉토리/파일에 사용 가능
  • 연결되어있는 파일 찾기 쉬움
  • 존재하지 않는 파일에 대해 작성 가능

Hard link: 파일이 심볼릭 링크 위치에 실제로 존재하는 것처럼 만듬

ln <파일명> <만들 파일명>

  • inode 번호에 직접 연결되어 만들어짐
  • 원본 파일의 inode을 공유하고 이름만 다른 파일이 생성됨
    • 파일 경로가 다르면 이름 같게 생성 가능
    • 이름을 제외한 모든 속성이 같음
    • 링크된 파일의 속성이 바뀌면 다른 파일도 속성이 함게 변경됨
  • 삭제
    • 하드 링크가 삭제되면 링크도 사라짐
    • 파일 내용은 그 파일의 모든 링크가 삭제될때까지 남아있음
      • 파일에 할당된 공간은 그대로 남아있다는 뜻
  • 장점
    • 애플리케이션은 차이를 모름
    • 그래서 더 유용함
  • 단점
    • 같은 파일 시스템 내에서만 사용 가능
    • 디렉토리 참조 불가
      • 파일에만 링크 가능
    • 구분할 수 없는게 단점이 될 수도 있음

references:

profile
우당탕탕

0개의 댓글