Git 커밋 조작하기, 히스토리 조작, 잔디밭 조작하기


1일 1커밋을 놓쳤을때 잔디밭이 비게 되는데 비어있는 잔디밭에 색깔을 칠해보자. 

비어있는 잔디는 git 커밋 히스토리의 날짜 조작을 통해 

과거의 커밋을 한 것처럼 조작 할 수 있다.  



1. 먼저 새로운 git-history를 조작할 테스트 repository를 만든다.





2. Git Bash를 열고 로컬 repository와 연결된 위치로 이동한다.






3. git log로 커밋한 내용을 확인한다.



1
git log
cs


commit 다음 나오는 문자열(7dc220b~로 시작하는) 해쉬값을 복사한다.






4. git commit 기록을 수정하는 첫번째 방법은 git 필터링을 활용하는 방법이다.





1
2
3
4
5
6
git filter-branch --env-filter \
    'if [ $GIT_COMMIT = 복사한해쉬값 ]
     then
         export GIT_AUTHOR_DATE="Tue Aug 4 11:00:00 2020 +0900"
         export GIT_COMMITTER_DATE="Tue Aug 4 11:00:00 2020 +0900"
     fi'
cs


위에는 간단하게 지정한 해쉬값이 같을 경우 날짜를 바꾼다는 얘기다.

나는 8월 17일에 커밋과 푸시를 했지만 8월 4일에 커밋한 것으로 바꿀 것이다.


GIT_AUTHOR_DATE와 GIT_COMMITTER_DATE에 바꾸고 싶은 날짜를 수정한다.

(앞뒤 공백을 꼭 포함해야 한다.)



1
2
3
4
'변경 내용은 :wq로 저장한다.'
git pull origin master --allow-unrelated-histories
 
git push origin master
cs




push를 완료하면


github에 8월 4일에 조작된 날짜로 잔디밭이 표시된 것을 확인 할 수 있다.



다음은 git 필터링을 활용하는 방법이 아닌 git rebase를 활용하여 커밋을 조작해보자.



5. git rebase를 활용한 조작방법


일단 날짜 형식의 200805, 200806 md파일을 준비하고 1개씩 커밋 푸시 하였다. 

그리고 git log를 통해 조작할 커밋 해쉬값을 복사한다.



git log를 보면 모두 8월 17일에 커밋되었다는 것을 알려주고 있다.


git rebase -i [해쉬값] 를 입력한다.





수정할 해쉬값 앞에 edit를 넣는다.


edit [해쉬값] [커밋 메세지] 





1
2
3
4
5
6
7
8
9
git rebase -i 해쉬값
 
GIT_COMMITTER_DATE="Aug 6 11:00 2020 +0900" git commit --amend --date="Aug 6 11:00 2020 +0900"
 
git rebase --continue
 
git pull origin master --allow-unrelated-histories
 
git push origin master
cs




위와 같이 입력 후 girhub repository를 확인하면 

커밋날짜가 조작되어 잔디밭에 색깔이 칠해진 것을 확인 할 수 있다.



8월 17일에 커밋한 파일날짜를 8월 6일로 수정하여

커밋한 파일의 타이틀과 내용 날짜 모두 동일하게 커밋된 것을 확인 할 수 있었다.

git rebase를 활용하여 커밋조작이 가능했다.




git filtering을 사용하는 방법과 git rebase를 사용해 커밋날짜 조작을 해보았다.


해당 내용은 stackoverflow를 참고하여 작성했다.


(https://stackoverflow.com/questions/454734/how-can-one-change-the-timestamp-of-an-old-commit-in-git)


윈도우 10 에서 anaconda3의 jupyter notebook을 사용하는데


콘솔화면으로 실행되는 것이 바탕화면에 걸리적거려

 

백그라운드에서 실행되게 설정하는 방법을 검색했다.





anaconda navigator를 사용해 launch행동으로 jupyter notebook을 백그라운드로 실행되게 만들수 있었다.






파이썬 디버깅이 쉬운 쥬피터 노트북을 구글 GCP 서버를 이용 설치해보겠다.



1. GCP 인스턴스를 생성해준다.




gcp는 지역마다 프리티어로 720시간 무료로 제공하는 region이 있다. 

인스턴스 생성전에 무료 지역이 있는지 확인하자.


본인은 우분투 18.04 버전에 지역은 서울로 인스턴스는 가장작은 micro로 설정했다.




2.  생성된 인스턴스에 접속해본다.








3. 파이썬, 쥬피터 노트북 설치한다.


1
2
3
4
5
6
7
# python3 pip 설치
 
$ sudo apt-get update
 
$ sudo apt update
$ sudo apt install python3-pip
$ pip3 --version
cs





1
2
3
4
5
# 쥬피터 노트북 설치
 
$ sudo apt-get install jupyter-notebook
$ jupyter --version
$ jupyter notebook
cs




쥬피터 노트북이 설치됐다면 ctrl+c를 여러번 눌러 종료시킨다.




4. 쥬피터 노트북 외부접속 가능 환경설정 만들기(1)



1
2
3
4
5
6
7
8
9
10
11
12
# ipython3 설치 및 외부접속 설정하기
 
$ sudo apt-get install ipython3
 
$ ipython3
 
from notebook.auth import passwd
passwd()
Enter password: 1234
Verify password: 1234
sha1:ef93cf62d4ab:bccb5bc464007fd425027d9426
exit()
cs





password 입력 후 나오는 sha1로 시작되는 암호화된 문자열을 복사해준다. 


만약 ipyhon3 명령어가 안된다면 update 한번 더 받아준다.


1
$ sudo apt-get update
cs



쥬피터 노트북에 로그인시 필요한 패스워드 설정을 다하고 빠져나온다.




4. 쥬피터 노트북 외부접속 가능 환경설정 만들기(2)



1
2
3
4
5
# 쥬피터 노트북 외부접속 환경설정하기
 
$ jupyter notebook --generate-config
 
$ vi ~/.jupyter/jupyter_notebook_config.py
cs


config 파일을 만들고 만든 config 파일을 열어본다.




config 파일 안에 수정할 주석 위치를 찾아가 주석해제하여 넣어도 되지만

본인은 맨 앞에 환경설정을 추가 하였다.


1
2
3
4
5
6
= get_config()
c.JupyterApp.config_file_name = 'juyter_notebook_config.py'
c.NotebookApp.allow_origin = '*'
c.NotebookApp.ip = 'GCP내부IP'
c.NotebookApp.open_browser = False
c.NotebookApp.password = '패스워드 sha1로 시작되는 암호화 문자열 입력'
cs



esc :wq 를 입력하여 저장하고 나온다.


이후 jupyter notebook으로 잘 구동되는지 확인한다.





http://외부ip:8888 로 접속한다.







설정한 비밀번호로 입력시 쥬피터 환경으로 접속되는 것을 확인할 수 있다.


이제 백그라운드에서 실행될수 있게 설정한다.


1
2
3
# 백그라운드에서 실행되게 하기
 
$ nohup jupyter notebook &
cs




백그라운드로 jupyter notebook 을 실행시키면 gcp를 종료해도 접속 가능하다.


jupyter notebook 종료는 프로세스 번호를 조회해서 

kill -9 [pid number] 로 종료가능하다.


1
2
3
# 백그라운드에서 종료하기
 
$ kill -9 17076
cs



github 잔디밭을 매일 만들어보자. (매일 파일이 생성되는 개발일기장을 만들어보자)


매일 파일이 하나씩 자동생성하여 github에 commit, push하는 sh 파일을 만들고 crontab으로 스케줄링을 걸것이다.


Github 자동 배포 설정하기


AWS EC2 Ubuntu Linux 18.04로 진행하였다.

 


1. git 설치



1
2
3
4
5
6
7
$ sudo apt-get install git
 
$ git --version
 
$ git config --global user.name "shlee0882"
 
$ git config --global user.email "shlee0882@gmail.com"
cs




2. ssh key 생성



1
2
3
4
5
6
7
8
9
$ ssh-keygen -t rsa -"shlee0882@gmail.com"
 
# 엔터 3번 이상 칩니다.
 
$ cd /home/ubuntu/.ssh/
 
$ cat id_rsa.pub
 
# ssh-rsa AAAAB........ 내용 복사한다.
cs






ssh key를 생성 후 값을 복사해 Settings > SSH and GPG keys > SSH keys > New SSH key > 추가 후 저장한다.










4. git clone ssh type



새로운 github 레파지토리를 생성한다.







SSH git repository 주소를 복사 한다.


1
2
# ssh git repository 주소를 clone 한다.
$ git clone git@github.com:shlee0882/git-diary.git
cs

git clone 이 잘 되었는지 확인한다.




5. 스케줄링 sh파일 작성


1
2
3
4
5
$ mkdir git-sch
 
$ cd git-sch
 
$ vi git-sch.sh
cs


git-sch 라는 디렉토리 안에 스케줄링 쉘(sh) 파일을 만들어 넣어놓는다.


git-sch.sh 파일 내용은 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# git-sch.sh
 
Y=$(date +%Y)
M=$(date +%m)
D=$(date +%d)
 
Ym=$Y-$M
Ymd=$Y-$M-$D
GitRep="git-diary"
 
HomeDir="/home/ubuntu"
GitDir="$HomeDir/$GitRep"
FileDir="$HomeDir/$GitRep/$Ym"
FileNm="$Ymd".md
 
mkdir -p $FileDir
 
echo "### $Ymd 일기" >> $FileDir/$FileNm
 
cd $GitDir
git add .
git commit -"commit $FileNm"
git push origin master
cs


1
2
3
# 권한 부여
 
$ chmod +x git-sch.sh
cs



6. 쉘파일 실행



쉘파일 디렉토리 위치에서


1
2
# 작성한 쉘파일 실행 > 테스트
$ ./git-sch.sh
cs


github repository에 접속해 push가 잘되었는지 확인한다.




성공적으로 push 된것을 확인했다.




7. 날짜 확인하기



크론탭으로 스케줄링 걸기 전에 현재 시간을 알아본다.


1
2
3
$ date
 
# Tue Jun  2 09:03:18 UTC 2020
cs



우리나라 시간대로 바꿔준다.

일본과 우리나라는 같은 시간대를 사용하므로 Japan으로 바꿔준다.



1
2
3
4
5
6
$ cd  /usr/share/zoneinfo/
$ ls
$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
 
$ date
# Tue Jun  2 18:53:40 JST 2020
cs




시간을 변경했으니 크론탭 서비스를 재시작해준다.




1
2
3
$ sudo service cron restart
 
$ sudo /etc/init.d/crond restart
cs




8. 크론탭 스케줄링 테스트 하기



1
2
3
4
5
# 크론탭 리스트 확인
$ crontab -l
 
# 크론탭 등록 및 수정
$ crontab -e
cs



크론탭 등록 시 에디터를 선택하는 창이 나오는데 

nano editor 1번을 선택하고 enter를 친다.


들어가면 주석으로 어떻게 사용하는지 상세하게 나와있다.

주석 맨 아래로 내려가 스케줄링 걸 작업을 적고 저장한다.


일단 크론탭이 잘 작동하는지 기본 테스트를 해보자.



1
2
3
4
$ crontab -e
 
# 추가
* * * * * echo "cron works" >> /home/ubuntu/test.txt
cs




파일을 저장후 나온다.

(ctrl+x, y, enter를 누른다) 


1
$ cat /home/ubuntu/test.txt
cs





크론탭에 매분마다 실행될수 있게 등록하여

시간이 지나면 cron works에 계속 찍히는 것을 확인할 수 있다.


크론탭이 정상적으로 동작하는 것을 확인했으므로 

테스트용 등록 크론탭을 지운다.


1
$ crontab -r
cs



9. 크론탭으로 github push 스케줄링 걸기


1
2
3
4
5
$ crontab -e
 
# 추가
# 분 시 일 월 요일 sh파일 
30 18 * * * /home/ubuntu/git-sch/git-sch.sh
cs



해당시간에 크론탭이 sh파일을 실행하여 github으로 push작업이 될것이고



매일 매일 제목이 붙은 github diary(일기장)이 생성될 것이다.







1. 파이썬 설치






2. 파이썬 환경변수 추가해주기





C:\Users\sanghyun\AppData\Local\Programs\Python\Python38-32\Scripts




3. 관리자권한으로 cmd 다시켜기






4. pip 명령어 사용해보기




이제 pip 명령어를 이용해 윈도우에 필요한 도구들을 설치할 수 있게 되었다.


1
2
3
$ pip install --upgrade pip setuptools
 
$ pip install --upgrade httpie
cs



IntelliJ 에서 subversion을 사용해 소스를 내려받으려고 했는데  

Cannot run program svn 오류가 발생하여 해당 내용을 정리하여 포스팅하려고 한다.


1. Subversion 1.8 다운로드 받는다.

(https://www.visualsvn.com/downloads/)





2. IntelliJ SVN 경로 설정


다운받고 적당한 위치에 압축을 풀고 


IntelliJ 설정 창으로 들어와 압축푼 경로의 \bin\svn.exe 를 붙여 


D:\Apache-Subversion-1.13.0\bin\svn.exe 를 입력해주고 apply OK 해준다.





IntelliJ를 재시작하여 svn repository가 잘 연결되었는지 확인해본다.




1. linux에서 alias 명령어란?



보통 리눅스에서 서버를 켜고 끌때 tomcat 폴더의 bin 폴더 안 startup.sh, shupdown,sh로 켜고끈다면 

매번 그곳으로  디렉토리를 바꿔가며(cd) 찾아가 해당 쉘파일(sh)을 실행시키기 힘든 경우가 많다.


개발중이고 반영이 많이 필요한 리눅스에 설치된 서버라면 더욱 그럴것 이다.

alias를 사용하여 커스텀 네임을 지정해준다면 change directory 없이 자신이 필요한 명령어를 바로 실행시킬수 있다.


1
2
3
4
5
// 서버 시작
alias mystart='sudo /home/top/tomcat7.0.28/bin/startup.sh'
 
// 서버 중지
alias mystop='sudo /home/top/tomcat7.0.28/bin/shutdown.sh'
cs


간단하게 tomcat 서버의 시작, 중지 쉘파일을 바로 실행할 alias를 mystart, mystop 으로 만들었다.

mystart, mystop를 linux 커맨드창에 친다면 서버가 시작되고 중지되는 것을 확인 할 수 있다.


그리고 alias를 쳐보면 현재 정의된 alias 리스트가 나열된다.



하지만 alias를 정의하고 서버접속이 끊어지면 alias가 초기화되어 다시 접속 시 커스텀 alias를 사용할 수 없는 문제가 있다.




2. alias 초기화 되지 않고 모든 사용자가 사용할수 있게 변경하기



alias를 모든 사용자가 사용할 수 있게 정의해보겠다.


linux root 계정으로 접속해 etc 디렉토리 아래의 profile 파일을 연다.


1
2
cd /etc
vi ./profile
cs



맨 마지막 줄에 다음 명령어를 추가해주고 저장 후 재접속한다.


1
2
alias mystart='sudo /home/top/tomcat7.0.28/bin/startup.sh'
alias mystop='sudo /home/top/tomcat7.0.28/bin/shutdown.sh'
cs



이제 root나 다른 계정으로 접속해도 전역으로 정의한 alias를 사용할 수 있다.

개발 소스 반영 및 재배포 시 손쉽게 서버를 켜고 끌수 있게 되었다.


사실 IaaS, PaaS, SaaS 를 소프트웨어 공학 시간에 배운적이 있지만

실제로 사용해보기 전까진 잘 알지 못했다. 


개념은 이해 되는데 실제 개발 및 테스트를 위해 사용해보고 

개념을 다시 살펴봤는데 본인이 사용한 서비스가 어떤 서비스였는지 잘 확인 할 수 있었다.





1. IaaS


서비스로서의 인프라스트럭처(Infrastructure as a Service, IaaS)는 서버, 스토리지, 네트워크를 필요에 따라 인프라 자원을 사용할 수 있게 클라우드 서비스를 제공하는 형태이다. 


간략하게 IaaS는 컴퓨터만 할당 받는것이다.


너가 만약 웹개발을 하여 만든 소스를 올리고 싶다면 


OS : 리눅스(16.x,18.x) 윈도우(7,10) 선택

Web Server : 톰캣(8.x,9.x), 웹로직, etc 선택

DB : mysql, mssql, maria, etc 선택 


버전까지 선택하여 개발환경을 꾸릴수 있다.

선택권이 모두 개발자에게 넘어간 것이다. 컴퓨터 환경만 빌려서 사용한다.


대표적인 서비스로




AWS EC2, Google Cloud Platform, Azure Virtual Machines, Naver Cloud Platform 이 있다.


위 서비스들은 1년간 무료사용 서비스를 제공한다.


초보 개발자들이나 돈이 없는 개발자들은 각각 1년간 IaaS를 돌려쓰며 돈을 아껴보자.

본인도 개발 및 간단한 테스트를 위해 1년간 돌려가며 써볼 생각이다. 

현재 1년간 무료 AWS EC2 서비스를 사용중인데 매우 만족하며 쓰고 있다.



2. PaaS


PaaS (Platform as a Service)라고도하는 클라우드 플랫폼 서비스는 

주로 애플리케이션에 사용되는 동안 특정 소프트웨어에 클라우드 구성 요소를 제공한다. 

PaaS는 개발자가 맞춤형 애플리케이션을 개발하고 구축 할 수있는 프레임 워크를 제공한다. 

모든 서버, 스토리지 및 네트워킹은 엔터프라이즈 또는 타사 공급자가 관리 할 수 ​​있으며 개발자는 응용 프로그램 관리를 유지할 수 있다.


간략하게 PaaS는 플랫폼서비스로


개발자는 IaaS에서 했던 복잡한 설치 및 환경설정을 하지 않아도 된다.

PaaS에서 정해준 OS, 버전, 어플리케이션 등이 있으므로 개발자는 완성된 소스를 올리기만 하면 된다.


개발자의 선택권이 줄어들었지만 그만큼 플랫폼에게 권한을 위임함으로써 

복잡한 서버, 환경구성에 신경쓰지 않아도 된다.


당연히 IaaS보다 PaaS가 비용면에서 비싸다.




AWS Elastic Beanstalk, Windows Azure, Heroku 등이 있다.


본인은 NodeJS소스를 Heroku에 바로 올려보았는데 정말 소스만 올리면 바로 올라가는 것을 확인 할 수 있었다.



3. SaaS


서비스로서의 소프트웨어(Software as a Service, SaaS)는 소프트웨어 및 관련 데이터는 중앙에 호스팅되고 사용자는 웹 브라우저 등의 클라이언트를 통해 접속하는 형태의 소프트웨어 전달 모델이다. 주문형 소프트웨어(on-demand software, 온디맨드 소프트웨어)라고도 한다.


간략하게 서비스를 이용할 수 있는 소프트웨어를 말한다.




Google Apps, Mail, Youtube, Blog ... 등이 있다.

+ Recent posts