Programmer Application Note

2015년 4월 22일 수요일

git 삭제된 파일만 되돌리기

오후 4:59 Posted by PAN.SPOT , , No comments
svn을 쓰다가 git으로 넘어온 사람들을 보면 간혹 svn update와 같이 동작 하는것을 원하는 사람들이 있다.
삭제된 파일만 되돌리기를 하고 싶은경우 이다.
즉 여러개의 파일이 있을 때 수정된 파일을 제외 하고 삭제된 파일만 다시 reset 하고 싶을경우 이다.
먼저 UNDO 하는 방법을 알아보자.
1.모든 파일을 되돌릴 때
$git reset --hard HEAD
2.특정 파일만 되돌릴때
$git checkout -- file
2번을 이용하면 특정파일만 되돌릴 수 있으나 파일을 일일이 기입하는 것은 여간 귀찮은일이 아니다. 그래서 돌리고 싶은 파일만 삭제한 후 아래와 같이 입력한다.
$git ls-files -d | xargs git checkout --
파이프와 xargs를 이용한 방법으로 명령어를 해석해보면 다음과 같다.
- git ls-files -d 는 삭제된 파일만 출력한다.
- 파이프라인은 왼쪽에 있는 명령어의 출력을 오른쪽 명령의 입력으로 전달한다.
- 여기에서 xargs를 이용하면 git ls-files -d의 출력 결과를 checkout --의 인자로 전달하여 사용할 수 잇다.
자세한 사항을 알고 싶을경우 xargs에서 -t 옵션을 넣어서 확인해 본다.

2015년 4월 21일 화요일

Gitlab error “fatal: The remote end hung up unexpectedly”

오후 7:00 Posted by PAN.SPOT , No comments
최초 데이터를 push 할 때
"fatal: The remote end hung up unexpectedly"가 난다면?

1.chunked boad size가 작아서 error 나는지 log를 확인 한다.
$ su -
$ vi /var/opt/gitlab/nginx/logs/gitlab_error.log
[error] 23946#0: *885 client intended to send too large chunked body: 524304336 bytes, client: xxxx, server: xxxx
2.gitlab의 nginx max body size를 변경한다.
$ vi /etc/gitlab/gitlab.rb
nginx['client_max_body_size'] = 'XXXm' // XXXmbyte
$ sudo gitlab-ctl reconfigure
3. 로컬 저장소에서 git push 가 제대로 동작하는지 확인
4. 나의 경우에는 너무 큰용량(약 8기가) 이였고, http 프로토롤을 사용 하였기 때문에 git push가 더 이상 error는 나지 않는데 멈춰 있는 현상이 발생하였다. 그래서 ssh프로토콜로 변경 하여  push를 다시 시도 하여서 성공함. http 프로토콜은 느려서 대용량에는 적합하지 않은듯 하다.

참고 ssh 공개키 생성 하여 ssh로 접속하기
$ssh-keygen -t rsa -C "gltlab mail 주소"
$sudo chmod -R 700 ~/.ssh
$cat /home/계정/.ssh/id_rsa.pub
나오는 내용을 복사 하여 gitlab profile의 ssh key 등록에 추가.

만약 ssh포트도 변경해야 한다면?
$ vi /etc/gitlab/gitlab.rb
gitlab_rails['gitlab_shell_ssh_port'] = 2222 // 22 port -> 2222 port
$ sudo gitlab-ctl reconfigure



git ignore 파일 쉽게 만들기

오후 5:45 Posted by PAN.SPOT , , No comments
리눅스 프로젝트를 하게 되면 make시에 각종 object 파일들이 생성되거나 변경 된다. 이 때 git에 적용하지 않을려면 .gitignore 파일에 무시할 폴더나 파일을 기록 하면 되는데 폴더가 많으면 쉽지 않다. 그렇때 아래의 커맨드를 이용해보자.

1. 최초 프로젝트를 make clean 한다.
$make clean 
2. 프로젝트를 git server에 push
$git add -A
$git push
3. 프로젝트를 컴파일 한다.
$make
4. git status를 하면 make시에 생성되는 파일들이 나온다.

5. make 후 생성된 모든 파일들을 .gitignore에 저장한다.
$git status --porcelain | grep '^??' | cut -c4- >>.gitignore
위의 커맨드를 분석하자면, 
git status --porcelain는 svn status 처럼 앞부분에 현재 상태를 출력된다. 
grep '^??'는 첫 단어가 ?? 으로 시작하는 untracked되는 파일들만 grep 한다.
cut -c4 는 앞에 ??를 삭제 하고 .gitignore에 저장하기 위함이다.

6.만약 추가되는 파일 이외에 수정된 파일도 제외 하려면
$git status --porcelain | grep '^ M' | cut -c4- >>.gitignore
7.수정된 파일들은 이미 버전관리 대상이기 때문에 버전관리 대상에서 지워준다.
$git rm -r --cached 제외할파일명
이때 파일은 그대로 남아 있다.
8.버전관리 대상에서 삭제한 파일들 커밋하기
$git commit -m 'delete file'
9.상태확인
$git status





2015년 4월 14일 화요일

/dev/null 과 2 > &1

오전 12:11 Posted by PAN.SPOT No comments

아래의 명령어에서 사용된 것을 하나씩 확인 해보자
backup.sh > /dev/null 2>&1
>(리다이렉션) : 표준 출력을 다음에 위치한 곳으로 우회 시킨다.
/dev/null : 모두 버려라
&j : j가 참조하고 있는곳
0:표준 입력,1:표준출력,2:표준에러

예)
$backup.sh > log.txt
backup.sh의 표준 출력을 log.txt로 보낸다.
$backup.sh 2> err.txt
backup.sh의 표준 에러를 err.txt로 보낸다.

이제 $backup.sh > /dev/null 2>&1 분석해보자.
backup.sh > /dev/null
- backup.sh의 표준 출력을 버려라.
2>&1
- 표준에러를 표춘 출력이 참조 하는곳으로 보내라.
backup.sh > /dev/null 2>&1
- backup.sh의 표준 출력을 버리고 표준 에러는 표준 출력이 참조하는곳(/dev/null)으로 보내라.

2015년 4월 13일 월요일

주기적인 작업 crontab

오후 11:53 Posted by PAN.SPOT No comments
crontab
설정된 시간에 따라 그 시간에 맞는 서비스를 실행 시키는 것
일반적으로 주기적으로 백업이 필요할 때 사용한다.

예약된 리스트
$crontab -l
작업 수정 및 등록
$crontab -e
작업 삭제
$crontab -r

아래의 폴더에 실행파일을 넣으면 끝
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

정밀하게 설정하기
$su - (root 권한)
$crontab -e
분(0-59) 시(0-23) 일(0-31) 월(1-12) 요일(0,7:일요일,1:월요일,.....) 명령어

예)
*/10 1-4 1,3 5 * backup.sh > /dev/null 2>&1

*/10 : 매 10분 간격으로
1-4 : 1,2,3,4 시에
1,3 : 1일과 3일에
5 : 5월에
* : 모든 요일에
즉 : 5/1 5/3일 1~4시 사에서 10분 간격으로 backup.sh을 실행하라는 뜻임.



gitlab backup

오후 11:17 Posted by PAN.SPOT , No comments

#gitlab backup
$sudo gitlab-rake gitlab:backup:create
$sudo ls /var/opt/gitlab/backups

#backup 위치 변경
$sudo vi /etc/gitlab/gitlab.rb
gitlab_rails['backup_path'] = '변경될 위치'
$sudo gitlab-ctl reconfigure

# limit backup lifetime to 7 days - 604800 seconds
$sudo vi /etc/gitlab/gitlab.rb
gitlab_rails['backup_keep_time'] = 604800
$sudo gitlab-ctl reconfigure

# restoring backup
$sudo cp 1393513186_gitlab_backup.tar /var/opt/gitlab/backups/
# Stop processes that are connected to the database
$sudo gitlab-ctl stop unicorn
$sudo gitlab-ctl stop sidekiq
# This command will overwrite the contents of your GitLab database!
$sudo gitlab-rake gitlab:backup:restore BACKUP=1393513186
# Start GitLab
$sudo gitlab-ctl start
# Create satellites
$sudo gitlab-rake gitlab:satellites:create
# Check GitLab
$sudo gitlab-rake gitlab:check SANITIZE=true

#scheduling a backup
$crontab -e
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1

gitlab git-data 위치 변경

오후 11:11 Posted by PAN.SPOT , No comments
git-data의 위치를 A서버에서 B서버로 변경 하려면??

A 서버 = gitlab server
B 서버 = data server (gitlab이 설치되어 있지않은 data server)

1. A서버의 git 계정의 uid와gid 정보를 가져옴.(uid:999,gid:999)
2. B서버에 git 계정을 추가
$sudo adduser --uid 999 git (A서버와 uid,gid를 일치 시킴 일치 시키지 않으면 permission denied 에러에 빠져 헤어나오지 못함.)
3. B서버(data가 저장될) 설정
$sudo mkdir git-data
$sudo chown git:git git-data/
4. B서버 삼바설정
$$sudo gitlab-ctl stop
$sudo system-config-samba (git-data 공유 설정)
$sudo service smbd restart
5. A서버(gitlab이 설치된) 설정
$sudo apt-get install cifs-utils
$sudo mkdir /mnt/git-data
$sudo mount -t cifs -o username=git,password=xxx //B서버주소/git-data /mnt/git-data
※A서버와 B서버의 git계정의 uid,gid를 동일 하게 변경 하였기 때문에 mount를 하면 A서버에도 git-data폴더는 git:git으로 표시된다. 만약 동일하지 않으면 B서버의 git계정의 (uid,gid)가 표기 되며, 이 후 작업 과정에서 permission denied 에러에 빠지게 될 것이다.
$sudo rsync -av /var/opt/gitlab/git-data/repositories /mnt/git-data/
$sudo vi /etc/gitlab/gitlab.rb
  git_data_dir '/mnt/git-data'
$sudo gitlab-ctl reconfigure
6.gitlab-satellites이 생성되었는지 확인
$sudo ls git-data/
7.gitlab 재시작
$sudo gitlab-ctl start
8.fstab 등록
$sudo vi /etc/fstab
//B서버주소/git-data    /mnt/git-data   cifs    username=git,password=xxxx  0   0
9.A서버 재부팅
$sudo reboot



2015년 4월 12일 일요일

gitlab 서버 구축

오후 5:52 Posted by PAN.SPOT , No comments
ubuntu 14.04 버전 (64bit)

1. Install and configure the necessary dependencies
$sudo apt-get install openssh-server
$sudo apt-get install postfix
2. Download the Omnibus package and install everything
$wget https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.9.2-omnibus-1_amd64.deb
$sudo dpkg -i gitlab_7.9.2-omnibus-1_amd64.deb
3. Configure and start GitLab
$sudo gitlab-ctl reconfigure
4. Browse to the hostname and login
Username: root
Password: 5iveL!fe

nginx web포트 변경
1. 8000 포트로 변경
$sudo vi /etc/gitlab/gitlab.rb
external_url 'http://localhost:8000'

※ 설치 후 기존 80포트는 apaches 서버로 사용 되고 있었기 때문에 포트를 변경할 필요가 있었다. 이때 생각 없이 8080포트로 변경 후 사용 하였을때, 아래와 같은 에러가 발생한다.
502 GitLab is not responding.
이유는 omnibus gitlab readme에서 확인 할 수 있다.
By default, Unicorn listens at TCP address 127.0.0.1:8080. Nginx listens on port 80 (HTTP) and/or 443 (HTTPS) on all interfaces.
그래서 포트를 8000으로 변경 해서 사용함.

2015년 4월 9일 목요일

C++ 표준

오후 4:52 Posted by PAN.SPOT , No comments
연도
C++ 표준
비공식 이름
2011
ISO/IEC 14882:2011
C++11 (c++0x)
2007
ISO/IEC TR 19768:2007
2003
ISO/IEC 14882:2003
C++03
1998
ISO/IEC 14882:1998
C++98

trac 서버 구축

오전 2:38 Posted by PAN.SPOT , No comments

ubuntu 14.04 기준

1.패키지 설치
$sudo apt-get install apache2
$sudo apt-get install apache2-utils
$sudo apt-get install trac libapache2-mod-python python-setuptools
$sudo apt-get install rcconf

2.apache authorization 파일 생성
최초 생성 시
$sudo htpasswd -c /etc/apache2/authorization.auth 사용자명
사용자 추가 시
$sudo htpasswd  /etc/apache2/authorization.auth 사용자명

3. apache2 trac 설정
$sudo vi /etc/apache2/mods-enable/svntrac.conf

<Location /trac>
SetHandler mod_python
SetEnv PYTHON_EGG_CACHE /home/trac/cache
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir trac경로
PythonOption TracUriRoot /trac
AuthType Basic
AuthName "This is your repository"
AuthUserFile /etc/apache2/authorization.auth
Require valid-user
</Location>

4.프로젝트 폴더 생성
$cd trac경로
$mkdir 프로젝트명
$chown -R www-data:www-data 프로젝트명
$trac-admin 프로젝트명 initenv
   - projectname : 프로젝트명
   - 디비 입력 : 그냥 엔터

5.시작 할때 마다 apache2 실행
$rcconf
apache2 선택

※ 기본 계정인 www-data를 변경 하고 싶다면?
$vi /etc/apache2/evnvars
export APACHE_RUN_USER=여기를 변경
export APACHE_RUN_GROUP=여기를 변경

svn 서버 구축

오전 2:38 Posted by PAN.SPOT , No comments
ubuntu 14.04 기준

1.패키지 설치
$sudo apt-get install apache2
$sudo apt-get install apache2-utils
$sudo apt-get install subversion libapache2-svn
$sudo apt-get install rcconf

2.apache authorization 파일 생성
최초 생성 시
$sudo htpasswd -c /etc/apache2/authorization.auth 사용자명
사용자 추가 시
$sudo htpasswd  /etc/apache2/authorization.auth 사용자명

3. apache2 svn 설정
$sudo vi /etc/apache2/mods-enable/svntrac.conf

<Location /svn>
DAV svn
SVNListParentPath On
SVNParentPath /home/svn
# How to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /etc/apache2/authorization.auth
# Only authenticated users may access
Require valid-user
</Location>

4.프로젝트 폴더 생성
$cd svn경로
$mkdir 프로젝트명
$svnadmin create 프로젝트명
$chown -R www-data:www-data 프로젝트명
$svn mkdir http://192.168.0.232/svn/supernova/trunk -m 'add trunk'
$svn mkdir http://192.168.0.232/svn/supernova/branches -m 'add branches'
$svn mkdir http://192.168.0.232/svn/supernova/tags -m 'add tags'

5.시작 할때 마다 apache2 실행
$rcconf
apache2 선택

※ 기본 계정인 www-data를 변경 하고 싶다면?
$vi /etc/apache2/evnvars
export APACHE_RUN_USER=여기를 변경
export APACHE_RUN_GROUP=여기를 변경

svn merge

오전 12:34 Posted by PAN.SPOT , No comments

● svn merge -r 옵션과 -c 옵션

svn merge -c 130 == svn merge -r 129:130
svn merge -c -130 == svn merge -r 130:129

● merge branches -> trunk 


       







▶ branches에서 수정된 30~34번까지의 내용을 trunk에 적용하려면?
$svn switch trunk URL : 작업사본을 trunk로 변경 (이미 trunk라면 생략)
$svn merge -r29:34 branches URL : 주의 할점은 30번 내용이 적용 될려면 29부터해야한다.

merge완료 후 commit 하면 R35(terminal:둥근모양) 상태가 된다.








▶ 만약 32번 내용만 빼고 merge 하려면?
$svn switch trunk URL : 작업사본을 trunk로 변경 (이미 trunk라면 생략)
$svn merge -r29:31 -r32:34 branches URL 

▶ cherry-pick 옵션을 이용한 리비전 선택 merge
$svn merge -c30,31,33,34 branches URL 

2015년 4월 7일 화요일

linux 쉘 명령어 모음

오후 8:26 Posted by PAN.SPOT No comments
$ll : ls -l
$Pushd : 현재디렉토리저장
$Popd : 저장한 디렉토리로 이동
$Dirs : 
저장된 디렉토리 표시
$chgrp 그룹명 파일또는폴더 :  그룹 변경
$df : 마운트된 파일 시스템의 사용 가능한 공간 확인
$du : 디렉토리의 파일용량
$free : 현재 메모리 사용량 및 사용가능한 메모리
$w : 현재 로그인한 사용자가 무엇을 하는지 알려줌 
$tty : 시스템에서 연결되어 사용하는 터미널 경로

svn url 변경

오후 7:07 Posted by PAN.SPOT , No comments
서버 저장소 주소 변경
$svn relocate

branches <-> trunk 간 주소 변경
$svn switch
   - switch는 하나의 로컬작업 저장소에서  branches로 일시 전환 했다가 trunk로 전환 할때 사용 한다.

svn 충돌 해결법

오후 6:54 Posted by PAN.SPOT , No comments

(e) edit - 병합된 파일을 편집기로 열기 
(df) diff-full - 병합된 파일을 보기 
(r) resolved - 병합된 파일을 채택하기 
(dc) display-conflict - 모든 충돌 사항을 보이기(잘 병합된 부분 제외) 
(mc) mine-conflict - 충돌 부분에 대하여 작업사본을 선택하기 
(tc) theirs-conflict - 충돌 부분에 대하여 저장소본을 선택하기
(mf) mine-full - 충돌난 파일에 대하여 작업사본 파일을 선택하기
(tf) theirs-full - 충돌난 파일에 대하여 저장소본 파일을 선택하기
(p) postpone - 나중에 해결할 것으로 표시해두기
(l) launch - 외부 툴을 실행하여 충돌을 해결
(s) show all - 옵션을 모두 출력

apt-get

오후 6:37 Posted by PAN.SPOT , No comments
apt-get(Advanced Packaging Tool)은 우분투(Ubuntu)를 포함안 데비안(Debian)계열의 리눅스에서 쓰이는 패키지 관리 명령어 도구입니다.

패키지 인덱스 인덱스 정보를 업데이트 : apt-get은 인덱스를 가지고 있는데 이 인덱스는 /etc/apt/sources.list에 있습니다. 이곳에 저장된 저장소에서 사용할 패키지의 정보를 얻습니다.
$sudo apt-get update

설치된 패키지 업그레이드 : 설치되어 있는 패키지를 모두 새버전으로 업그레이드 합니다.
$sudo apt-get  upgrade

의존성검사하며 설치하기
$sudo apt-get dist-upgrade

패키지 설치
$sudo apt-get install 패키지이름

패키지 재설치
$apt-get --reinstall install 패키지이름

패키지 삭제 : 설정파일은 지우지 않음
$sudo apt-get remove 패키지이름

패키지 삭제 : 설정파일까지 모두 지움
$sudo apt-get --purge remove 패키지이름

패키지 소스코드 다운로드
$sudo apt-get source 패키지이름

위에서 받은 소스코드를 의존성있게 빌드
$sudo apt-get build-dep 패키지이름

패키지 검색
$sudo apt-cache  search 패키지이름

패키지 정보 보기
$sudo apt-cache show 패키지이름

apt를 이용해서 설치된 deb패키지는 /var/cache/apt/archive/ 에 설치가 됩니다.