ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GIT
    바탕지식들 2019. 1. 22. 03:05

    준비사항    

    사용은 우분투(18.10)랑 라즈베리파이3 B+

    가끔 맥 OSX 

    원도우는 존재하지 않지만 그쪽도 터미널을 뛰울수가 있다는거

    포스팅 하나로 땡치면 좋은데 그게 안될경우 뒤쪽에 뭔가 찌질하게 붙을수 있다. 큼.


     GIT 처음부터 시작

    설치는

    sudo apt-get install git


    우분투와 파이 모두 다 설치해야 된다.(당연한가?)

    우분투는 apt 로 라즈베리파이는 apt-get으로 하면 된다.

    뭐 둘다 안되는건 아니지만.. 대략 사용이 그렇다.

    일단 설치부터 해두고나서 깃에 대한 개념을 넣어 보자.


    들어가기 전에 잡설.

    원래 git 이전에도 비슷한거 많았다. 단지 git이 대명사가 된건 딱하나..

    사람들이 잴 많이 쓴다는 거다.

    사실 이정도 되면 그냥 필수로 익혀야 되는 넘이 되신거지.


    개발자는 기본적으로 자신이 한일이 투명하게 공개된다.

    재네 맨날 앉아 있는데 대체 일은 하나?

    이렇게 묻는다면 그야말로 바보다.

    개발자는 자신이 한일을 완전 공개한다.

    Git 과 같은 방식으로 ....(요령피워 놀수가 없다..ㅠ.ㅠ)


    협업을 위해 태어났다.

    처음에는 파일로 공유했다. 개발자들이 만드는 문서를 소스코드라고 부르는데 파일로 공유하면 미친다.


    그래서 서버를 만들어서 거기 몰빵했다.

    관리를 위해서 CVN또는 SVN 이라는 툴을 만들었는데 그게 2000년도다.


    서버 몰빵은 복잡했고 순서대로 해야 됬고 막상 위험은 언제나 상주했다.

    서버가 날아가면 모든게 다 날아가니 그걸 보완하기 위해서 클라이언트에도 자료를 받는 방식이 생겼다.


    이게 바로 GIT 이다.


    나온 역사를 보고 나면 이것에 강조하는 부분이 먼지 자연스럽게 알수 있다.

    누가 언제 어떻게 어떤코드를 변경하거나 추가하거나 만들었나?

    이게 핵심이다. 이걸 ADD , commit 이라고 부른다.


    그런데 여기에 추가로 개발자들은 자신의 소스코드를 검증받고 리뷰하는 문화가 생겼다. GITHUB 같은 GIT을 이용한 서비스가 만들어지면서 생긴문화다.

    이런걸 할려면 소스코드를 자신의 하드에 다운받는데 그걸 clone 이라고 부르고

    만약 자신의 의견이 담아 소스코드를 변경할 목적이면 브랜치(branch=나뭇가지) 라는걸 한다.


    깃을 배울땐 기본관리 명령어를 중심으로 익히고 그뒤에 브랜치와 같은 파생기능을 배우는것이 순서라고 하겠다.


    쓰는거 부터 정리

    git 설치

    sudo apt install git


    버전확인

    git --version


    모를땐 도움말

    git --help


    도움말이 중요한 이유는 이것이 정말 잘 정리되어서 나오기 때문이다.

    도움말을 볼때 단계로 나눠진다. 이것도 다 이유가 있다.

    다음은 여러가지 상황에서 자주 사용하는 깃 명령입니다:

    작업 공간 시작 (참고: git help tutorial)
       clone      저장소를 복제해 새 디렉터리로 가져옵니다
       init       빈 깃 저장소를 만들거나 기존 저장소를 다시 초기화합니다

    변경 사항에 대한 작업 (참고: git help everyday)
       add        파일 내용을 인덱스에 추가합니다
       mv         파일, 디렉터리, 심볼릭 링크를 옮기거나 이름을 바꿉니다
       reset      현재 HEAD를 지정한 상태로 재설정화합니다
       rm         파일을 작업 폴더에서 제거하고 인덱스에서도 제거합니다

    커밋 내역과 상태 보기 (참고: git help revisions)
       bisect     이진 탐색으로 버그를 만들어낸 커밋을 찾습니다
       grep       패턴과 일치하는 줄을 표시합니다
       log        커밋 기록을 표시합니다
       show       여러가지 종류의 오브젝트를 표시합니다
       status     작업 폴더 상태를 표시합니다

    커밋 내역을 키우고, 표시하고, 조작하기
       branch     브랜치를 만들거나, 삭제하거나, 목록을 출력합니다
       checkout   브랜치를 전환하거나 작업 파일을 복구합니다
       commit     바뀐 사항을 저장소에 기록합니다
       diff       커밋과 커밋 사이, 커밋과 작업 내용 사이 등의 바뀐 점을 봅니다
       merge      여러 개의 개발 내역을 하나로 합칩니다
       rebase     커밋을 다른 베이스 끝의 최상위에서 적용합니다
       tag        태그를 만들거나, 표시하거나, 삭제하거나, GPG 서명을 검증합니다

    협동 작업 (참고: git help workflows)
       fetch      다른 저장소에서 오브젝트와 레퍼런스를 다운로드합니다
       pull       다른 저장소 또는 다른 로컬 브랜치에서 가져오거나 통합합니다
       push       원격 레퍼런스 및 그와 관련된 오브젝트를 업데이트합니다

    'git help -a' 및 'git help -g' 명령을 실행하면 하위 명령어와 개념 설명서의
    목록을 볼 수 있습니다. 특정 하위 명령어나 개념에 대해 읽어 보려면 'git help
    <명령>' 또는 'git help <개념>' 명령을 실행하십시오.


    저걸로 모든걸 다 해결할수는 없다.

    단지 명령어를 다 외워서 사용할 필요가 없다는걸 강조하기 위해 넣었다.


    가장 중요한건 흐름을 머리속에 넣어 둬야 한다는거다.


    깃을 설치하고 나면 두가지로 나뉜다.

    깃허브에 레포지터리를 만들고 로컬의 레포지터리랑 연결하는작업.

    블라블라작업을 하고.

    둘의 버전을 맞추는 작업이다.


    사실상 이런 3단계의 작업을 먼저 익히고 난 다음에 브런치와 같은 파생작업을 하는게 좋다.

    해깔리지 않으니까.말이다.


    깃 설정

    깃을 사용할 폴더를 만든다. 폴더로 들어가서

    sudo git init

    으로 깃을 해당 폴더에 설치및 초기화 한다.


    깃허브에 레포지터리가 있어서 받아 오겠다면 클론작업을 한다.

    git remote add origin 래포지터리

    git push -u origin master

    받아올것이 아니라면 그냥 만들고 정리하면 된다.

    git clone 의 경우에는 래포지터리의 이름그대로 폴더가 만들어지고

    그 안에 내용이 다운로드 된다.


    git remote add orgin 의 경우에는 지금 들어가 있는 폴더에 해당 주소의 내용이 들어 온다.

    여기까지 간다음 환경 설정을 한다.

    환경설정은 깃을 깃허브에 올리거나 내릴때 필요하다.

    당연히 어떤 환경설정도 폴더에만 적용되는 지역설정과 깃전체에 적용되는

    전역 설정으로 나뉜다.


    git config

    /etc/gitconfig

    깃과 관련된 설정정보가 저장된다.( --sysytem 옵션의 정보)


    ~/.gitconfig 또는 ~/.config/git/config

    대부분 접하는 전역설정정보가 들어가는곳이다. (--global 옵션의 정보)


    깃폴더 내의 숨김파일인 .git/config

    지역설정의 정보 ( 아무런 옵션이 없이 사용할때)


    여기서는 두가지만 알면 된다 --global 과 아무 옵션이 없는것.


    git config --global user.email "깃허브이메일주소"

    git config --global user.name "깃허브이름"

    git config --global core.editor vi


    잘 들어 갔는지 확인을 해보자.


    git config --list



    폴더에 일단 작업을 하고 난다음 해당 파일을 git 에 추가한다.


    git add *

    파일 하나만 콕 찝어서 한다면

    git add 파일명


    이제부터 가장 많이 써먹는 놈이다. 깃의 상태확인이다.


    git status


    이늠을 가장 많이 써먹냐 하면 깃을 설치하고 일단 이늠만 치면 뭘 어케 해야 되는지

    도움말이 같이 뜨기 때문이다.


    add 하지 않았다면 하라고.. commit 하지 않았다면 commit 하라고 말이다.


    sudo git commit -m "코밋할 내용 "


    이렇식으로 로컬에서 작업한다음 코밋까지 끝내면 push 를 사용해서

    깃허브에 올리게 된다.


    현재 까지는 마스터로 올리는 상태라서 다른건 필요없다.


    지금 까지 한넘을 살펴보자.

    git log

    요상한 메시지가 나오고..

    : 다음 프롬프트가 떠 있는 화면이 나올꺼다.

    이건 내용이 많은데 한화면에 안걸려서 짤린거다.

    엔터를 치거나 화살표를 내리면 로그 끝까지 가게 된다.


    거기서 q 를 누르면 나온다.


    우쨋건 git log 는 -p 옵션만 알면된다.

    나머지 엄청 많지만 패스

    왜냐하면 git log 나 git diff 같은 녀석은 터미널로 쓰기에는 정말 빡세다.

    이늠들을 잘 쓰겟다고 나온 녀석들이 대부분의 git UI프로그램들이란걸 기억하자.


    정리를 해주면

    git log 의 경우에는 커밋작업자와 내용 일시등이 다 들어 있다.

    git status 의 경우 지금 현재 바뀐 워킹디렉토리, 스테이징영역, 등등의 현재변경내용만 나온다.

    git diff 의 경우에는 파일 하나를 콕찝어서 내역등을 살필수 있다.


    여기 3가지는 대부분 혼용으로 사용된다.

    log 와 diff 의 경우 조회후 q를 누르면 나올수 있다.

    큰건 log 작은건 diff 현시점조회는 status 라고 기억하면된다.



    이제 나오는것은 가장 머리아픈 브런치(branch) 와 머지(merge) 기능이다.

    사용법이 어려운것이 아니라 마스터에서 브런치로 가지를 하나 땐다음

    거기에서 어떤 작업을 하고 머지로 다시 마스터에 합친다는 뜻이다.


    브런치는 어렵지 않지만 바뀐 변경 내용을 머지로 합치는건 이야기가 다르다.

    일종의 마스터를 운영하는 프로그래머가 그 소스를 확인하고 OK해줘야 합처질것이 아닌가 !!


    git branch 브런치이름


    이러면 마스터 브런치에 또는 메인스트림에 브런치가 하나생긴다.

    그와 동시에 브런치이름으로 메인스트림에 포인터가 생긴다.


    실제 브런치를 생성해서 소스코드를 바꾸고 커밋하면 여전히 마스터에 커밋된다.


    브런치를 따서 그 이름으로 할려면 포인터를 변경해야 된다.


    git checkout 브런치이름


    마스터로 돌아갈땐 두가지 작업을 동시에 해야된다.


    git checkout master

    git merge 브런치이름


    마스터에 브런치가 합쳐지고 더이상 필요가 없으면

    git branch -d 브런치이름

    이렇게 지워 준다.


    그런데 이런 작업은 정말 git UI프로그램을 동원하는게 맞다.

    머리가 터질듯이 어려워 질것이다.

    서버 환경에서 git 사용하기

    걍 깃허브에 올리고 어쩌고 하지 않고 로컬에서 git만 사용해서 걍 쓰는거다.

    바로 옆에 컴퓨터랑 git으로 연결하면서 쓰는쪽이다.


    대략 우분투 노트북이랑 라즈베리파이랑 공유기만 연결해서 굴리는 시스템이라고 생각하면 된다.


    git 에서 내부적으로 제공하는 데몬서버를 쓰거나 아파치서버로 구성할수 있다.


    내용을 볼려면

    git clone --help


    서버를 써먹을땐 4가지 (ssh, git, http(s), file )가 필수고 추가로 ftp, RSYNC가 있다.


    근데.. 걍 기본 4가지만 보자.


    서버용 저장소를 만든다.

    순수하게 서버에서 저장하는 용도로 쓰여진다.

    이때는 init 옵션이 아니라 clone --bare 옵션을 쓴다.


    git clone --bare 저장소이름 저장소이름.git

    뒤쪽에 .git은 서버용 git저장소의 디랙토리 이름은 끝이 .git 으로 명명규칙이다.

    (안해도 굴러간다만.. 걍 이게 규칙이라고...index.html 같은거랄까..)


    만일 복제할 저장소가 없고 서버용으로만 쓴다면


    git --bare init

    이렇게 하면 생성된 디랙토리 안에 아무런 파일이 존재하지 않고

    git clone --bare 옵션으로 만들때 나타나는 마스터 브랜치 관련 파일도 없다.

    즉 암것도 없다.

    사실상 저렇게 말고 걍 clone --bare 를 쓰길 권한다.

    (물론 저늠도 네트웍 하드에 박아 쓸땐 필요하다만..)


    1. 파일 프로토콜로 써먹기

    이쪽은 원격서버를 삼바 같은 넘으로 걍 공유하는거다.

    이건 뭐..에매하다.

    삼바 같은넘으로 원본 소스 폴더로 들어가서


    git clone c:/로컬하드폴더명


    이렇게 해서 걍 복사해 쓰는거다.

    뭐 권장하는 방법은 아니지만 몇명 안된다거나. 내 컴터가 여러대인데...

    설정하기 귀찮거나. 등등일때 써먹으면 좋다.

    특히나 원도우랑 리눅스랑 맥이랑 우분투랑 라즈베리파이가 한방에 다 있으면

    거의 돌아 버리는데 라즈베리파이 같은넘에 박아두고

    삼바로 다 공유하면서 버전을 키운다면 이방법이 정말 편하다. 훅 편하다.

    각각의 운영체제의 파일시스템마저 다르기 때문에 옮기고 어쩌고 할땐 정말 좋다.


    2. git 내장 프로토콜로 써먹기

    포트번호 9418 번으로 쓴다 SSH랑 거의 비슷하지만 관리기능과 접근권한관리 기능이 없다.

    즉 이쪽은 내부에서만 접근이 가능하게하고 외부로 돌리면 초토화 된다.


    깃 내부 데몬을 사용할땐 필수적으로

    git-export-daemon-ok 파일이 폴더 안에 필요하다.

    (sudo touch git-export-daemon-ok)


    다음

    git daemon 명령을 쓰는데. 뒤쪽넘이 많다.

    git daemon --help 으로 확인하면된다.


    잠깐 보면

    export-all

    현재 폴더 하위에 있는 모든 git 저장소를 공유한다.


    base-path

    공유할 폴더를 지정할수가 있다.


    reuseaddr

    데몬서버 재시작시 빠르게 시작


    informative-errors

    에러 메시지를 git클라이언트에 제공


    verbose

    저장소와 관련된 내용을 상세하게 출력한다.


    다 합쳐서 써먹는다.


    git daemon --base-path=/폴더주소 --export-all --reuseaddr -- informative-errors --verbose &


    크 길다.


    그럼 굴러가는지 확인하자.


    netstat -an | grep 9418


    포트가 먹고 있는지 (포트번호뒤에 LISTEN)확인한뒤에

    저장소를 복사해 온다.


    git clone git://192.168.0.50:9418/python_project.git


    나중에 작업하고 git push 하면 에러 뜸.

    이땐 처음 데몬 뛰울떄 --enable=receive-pack \ 을 추가해 준다.


    다시 말하지만 이내장 프로토콜을 써먹는 방식은 보안이 전혀 안된다.

    중간에 방화벽으로 포트가 막혀 있으면 또 못쓴다. 이래저래 권장하지는 않는다.


    대부분 소스를 핸드폰등에 박아 넣을떄 사용된다.



    3. ssh 프로토콜로 써먹음

    이방법은 아마 대부분 가장 잘 쓰는 쪽일 것이다.


    git clone ssh://사용자이름@192.168.0.50/python_project.git


    사용자 이름은 리눅스나 라즈베리파이에서 로그인한 계정명이다.

    어쨋건 ssh로 들어간거라서 들어갈땐 비번이 당연히 필요하다.


    4. http 또는 https 사용하기(아파치서버사용하기)

    사실 이방법은 큼..본인은 실패했다. 망할 아파치서버의 셋팅은 너무 빡셌다.

    일단 사용되고 있는 사이트가 있는데..

    이거 깃을 굴리면 그게 나가고 뭐.. 그렇다는거다..ㅠ.ㅠ

    일단 적어둔다.


    아파치 서버에 git-http-backend CGI를 적용해야된다.

    웹서버에 CGI를 굴릴려면 mod_cgi mod_alias  mod_env mod_rewrite 기능 설치


    sudo a2enmod cgi alias env rewrite


    이제 우분투나 라즈베리파이에서는 두가지 방법중에서 하나를 써야하는데..

    이게참.. 난감하다.

    일명 권한설정 문재라서 더 빡센지도..(원도우는 이딴거 없다.ㅋㅋ)


    apt apt-get yum 같은걸루 아파치를 설치하면

    유저는 www-data 그룹은 www-data 이렇게 지정된다.

    권한설정의 문재는 이걸 바꿔 주면 된다.


    /etc/apache2/envvars


    깃 저장소에서  ls -al 한뒤에 폴더 권한을 본뒤에

    거기에 맞는 유저와 그룹으로 지정해주면 된다.


    이런 방법을 안쓰고 할려면 깃 저장소의 권한을 바꿔주면된다.


    sudo chown -R www-data:www-data /깃주소폴더



    깃저장소에 접근하도록 아파치 설정에 주소를 추가해 준다.

    /etc/apache2/apache2.conf 를 열어서


    #git 저장소 위치 지정하기=>대소문자 주의

    SetEnv GIT_PROJECT_ROOT /깃주소폴더


    #별도의 인증없이 통과한다는 뜻.

    SetEnv GIT_HTTP_EXPORT_ALL


    #아파치 웹서버가 git스크립트를 만나면 git-http-backend CGI를 작동시켜라의 뜻

    #웹서버에 따라 안굴러갈경우도 있는데 위치를 확인해서 경로 수정이 있을수 있다.

    ScriptAlias /git/ /usr/lib/git-core/git-http-backend/



    <Directory "/usr/lib/git-core*">

    Option ExecCGI Indexes

    Order allow,deny

    Allow form all

    Require all granted

    </Directory>


    <LocationMatch "^/git/.*/git-receive-pack$">

    AuthType Basic

    AuthName "Git Access"


    #깃저장소에 접근하기 위한 사용자 정보를 저장하는 곳이다.

    #sudo htdigest -c /깃주소/.htpasswd "Git Access" 사용자이름

    #위는 사용자 이름을 .htpasswd 에 추가 하라는 명령임

    AuthUserFile /깃주소/.htpasswd

    Require valid-user

    </LocationMatch>



    접속을 할땐

    재부팅후에 http 로 깃저장소에 접근가능해 진다.


    git clone http://127.0.0.1/깃주소/깃폴더.git




    git push

    git config


    git fetch //원격저장소의 내용을 받아서 로컬과 비교한다.

    git status//로컬의 변경 내용을 나타낸다.


    git pull



    로컬에서 깃을 만들고 원격(깃허브)에 넣을때.


    깃허브에서 리포지터리를 하나 만든다.

    readme.md 를 만들지 않는다.


    리포지리 주소를 복사.


    git remote add origin 리포지터리 주소


    이후 둘은 연동된다.


    깃 로컬에 README.MD (대문자)파일을 만들어 둔다.

    ------------------------------------------------------------------------------------

    gogs git UI

    우분투에서 깃서버를 만든다면 참조할것.


    댓글

© 2018 T-Story. All right reserved.