DevOps/GIT

github#3 gistory and git rm

aliceintr 2020. 11. 16. 14:01
반응형

1. Python 설치하기

www.python.org/downloads/release/python-390/

 

Python Release Python 3.9.0

The official home of the Python Programming Language

www.python.org


 

2. gistory Mac 설치하기

파이썬 설치를 마치고 나서 아래 명령어로 git story 설치 해줌

sudo pip3 install gistory

% sudo pip3 install gistory
WARNING: The directory '/Users/alice/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting gistory
  Downloading gistory-0.44-py3-none-any.whl (196 kB)
     |████████████████████████████████| 196 kB 5.4 MB/s 
Collecting six
  Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: six, gistory
Successfully installed gistory-0.44 six-1.15.0
WARNING: You are using pip version 20.2.3; however, version 20.2.4 is available.
You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9 -m pip install --upgrade pip' command.

 


3. gistory 실행하기

내 로컬 git repo(.git 파일이 있는곳 )에서 gistory 실행한다.

% cd .git
% gistory
Bottle v0.13-dev server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:8805/
Hit Ctrl-C to quit.

web browser에서 localhost:8805에 접속한다. 포트넘버는 위의 gistory 에서 나온 포트 번호 "8805" 사용한다.

 

다음과 같이 GUI 화면을 볼 수 있다.

계속 gistory running 상태로 만들고 새로운 터미너을 열어서 작업한다.

 

 


4. gistory : git add

git add [file] 명령어를 실행한 후 gistory 체크해 보았다.

% git add S03_exercise.java

[gistory]

add 된 파일의 이름은 ./index 에 보여지고

file 그 자체 object 는 ./objects 에 보여진다.

 

 

여기서 흥미로운 사실은 S03_exercise/src/Main.java S03_exercise.java 는 같은 내용의 코드를 가지고 있다.

그래서 object ID 도 같은 것으로 보여진다. 이것이 Git의 특징 중이 하나이다. 파일이름이 다르지만 콘텐츠가 동일하다면 같은 오브젝트로 인식한다.

 

 

 


5. gistory : object 파일명의 원리

 

git의 저장 원리 : git 은 SHA1 hash 알고리즘을 통해 파일명을 바꾸고, 앞에 두자리 "aa" 라는 디렉토리를 만들고 그 뒤문자를 파일명으로 하여 오브젝트로 저장한다.

 


6. gistory : commit

 

Commit 또 오브젝트로 저장한다.

tree : object 가 링크되어 있음. Commit 된 파일이름과 내용을 볼 수 있다.

blob : 파일의 내용을 담겨있음

Parent : 이전 commit 의 정보

 

 

그러나 여기서 내 로컬에서는 이미 삭제를 한 폴더인데 아직도 commit에 남아있는 파일들이 있어

git rm 명령어를 통해 삭제 해 주었다.

% ls -al     
total 24
drwxr-xr-x   6 alice  staff   192 15 Nov 22:54 .
drwx------@  9 alice  staff   288 15 Nov 00:33 ..
drwxr-xr-x  13 alice  staff   416 15 Nov 23:13 .git
-rw-r--r--   1 alice  staff  3985 15 Nov 01:27 S03_DataType.java
-rw-r--r--   1 alice  staff  1284 15 Nov 22:54 S03_exercise.java
-rw-r--r--   1 alice  staff  3269 15 Nov 22:07 S04_Condition.java

% git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	deleted:    Condition_S04/.DS_Store
	deleted:    Condition_S04/.classpath
	deleted:    Condition_S04/.project
	deleted:    Condition_S04/.settings/org.eclipse.jdt.core.prefs
	deleted:    Condition_S04/bin/Main.class
	deleted:    Condition_S04/src/Main.java
	deleted:    DataType_S03.java
	deleted:    DataType_S03/.classpath
	deleted:    DataType_S03/.project
	deleted:    DataType_S03/.settings/org.eclipse.jdt.core.prefs
	deleted:    DataType_S03/bin/Hello.class
	deleted:    DataType_S03/src/Hello.java
	deleted:    Operator_S04/.classpath
	deleted:    Operator_S04/.project
	deleted:    Operator_S04/.settings/org.eclipse.jdt.core.prefs
	deleted:    Operator_S04/bin/Main.class
	deleted:    Operator_S04/src/Main.java
	deleted:    S03_exercise/.classpath
	deleted:    S03_exercise/.project
	deleted:    S03_exercise/.settings/org.eclipse.jdt.core.prefs
	deleted:    S03_exercise/bin/Main.class
	deleted:    S03_exercise/src/Main.java

 

아직도 commit 처리가 되지않은 삭제된 파일들이 있다.

이제 삭제 처리를 해준다.

 

% git rm -r Condition_S04 
rm 'Condition_S04/.DS_Store'
rm 'Condition_S04/.classpath'
rm 'Condition_S04/.project'
rm 'Condition_S04/.settings/org.eclipse.jdt.core.prefs'
rm 'Condition_S04/bin/Main.class'
rm 'Condition_S04/src/Main.java'

% git rm -r Operator_S04
rm 'Operator_S04/.classpath'
rm 'Operator_S04/.project'
rm 'Operator_S04/.settings/org.eclipse.jdt.core.prefs'
rm 'Operator_S04/bin/Main.class'
rm 'Operator_S04/src/Main.java'

% git rm -r S03_exercise
rm 'S03_exercise/.classpath'
rm 'S03_exercise/.project'
rm 'S03_exercise/.settings/org.eclipse.jdt.core.prefs'
rm 'S03_exercise/bin/Main.class'
rm 'S03_exercise/src/Main.java'

% git rm -r DataType_S03
rm 'DataType_S03/.classpath'
rm 'DataType_S03/.project'
rm 'DataType_S03/.settings/org.eclipse.jdt.core.prefs'
rm 'DataType_S03/bin/Hello.class'
rm 'DataType_S03/src/Hello.java'

% git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    Condition_S04/.DS_Store
	deleted:    Condition_S04/.classpath
	deleted:    Condition_S04/.project
	deleted:    Condition_S04/.settings/org.eclipse.jdt.core.prefs
	deleted:    Condition_S04/bin/Main.class
	deleted:    Condition_S04/src/Main.java
	deleted:    DataType_S03/.classpath
	deleted:    DataType_S03/.project
	deleted:    DataType_S03/.settings/org.eclipse.jdt.core.prefs
	deleted:    DataType_S03/bin/Hello.class
	deleted:    DataType_S03/src/Hello.java
	deleted:    Operator_S04/.classpath
	deleted:    Operator_S04/.project
	deleted:    Operator_S04/.settings/org.eclipse.jdt.core.prefs
	deleted:    Operator_S04/bin/Main.class
	deleted:    Operator_S04/src/Main.java
	deleted:    S03_exercise/.classpath
	deleted:    S03_exercise/.project
	deleted:    S03_exercise/.settings/org.eclipse.jdt.core.prefs
	deleted:    S03_exercise/bin/Main.class
	deleted:    S03_exercise/src/Main.java

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	deleted:    DataType_S03.java

% ls -ltr
total 24
-rw-r--r--  1 alice  staff  3985 15 Nov 01:27 S03_DataType.java
-rw-r--r--  1 alice  staff  3269 15 Nov 22:07 S04_Condition.java
-rw-r--r--  1 alice  staff  1284 15 Nov 22:54 S03_exercise.java

% git rm DataType_S03.java
rm 'DataType_S03.java'

완전히 깨끗이 삭제 후

다시 commit 을 해준다

% git commit -m "Delete Unused files and dir"

[master 226927c] Delete Unused files and dir
 22 files changed, 828 deletions(-)
 delete mode 100644 Condition_S04/.DS_Store
 delete mode 100644 Condition_S04/.classpath
 delete mode 100644 Condition_S04/.project
 delete mode 100644 Condition_S04/.settings/org.eclipse.jdt.core.prefs
 delete mode 100644 Condition_S04/bin/Main.class
 delete mode 100644 Condition_S04/src/Main.java
 delete mode 100644 DataType_S03.java
 delete mode 100644 DataType_S03/.classpath
 delete mode 100644 DataType_S03/.project
 delete mode 100644 DataType_S03/.settings/org.eclipse.jdt.core.prefs
 delete mode 100644 DataType_S03/bin/Hello.class
 delete mode 100644 DataType_S03/src/Hello.java
 delete mode 100644 Operator_S04/.classpath
 delete mode 100644 Operator_S04/.project
 delete mode 100644 Operator_S04/.settings/org.eclipse.jdt.core.prefs
 delete mode 100644 Operator_S04/bin/Main.class
 delete mode 100644 Operator_S04/src/Main.java
 delete mode 100644 S03_exercise/.classpath
 delete mode 100644 S03_exercise/.project
 delete mode 100644 S03_exercise/.settings/org.eclipse.jdt.core.prefs
 delete mode 100644 S03_exercise/bin/Main.class
 delete mode 100644 S03_exercise/src/Main.java

 그 후 에 gistory를 확인하면 파일들이 다 제거된 것을 볼 수 있다.

 


7. gistory : status

commit 을 이미 한 파일 중 하나의 파일을 vim 으로 수정한다.

% vim S03_exercise.java
% git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   S03_exercise.java

no changes added to commit (use "git add" and/or "git commit -a")

수정 된 파일이 아직 commit 에 반영되지 않을 것을 볼 수 있다.

 

파일 내용을 보면 아직 수정이 안될 것을 볼수 있다.

이제 git add 를 해본다.

% git add S03_exercise.java 
% git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   S03_exercise.java

이제 gistory 를 보면 수정된 오브젝트가 있는 것을 볼 수 있다.

파일이름은 같으나 오브젝트 넘버가 다른것을 확인할 수 있다.

 

 

Before) 93af838d3d7738d810690a8c4cea5ea50612fae1

After) 725f4053c7bbd6159b5c7c5649d3c28066600c32

 

이제 commit 을 해보자

% git commit -m "Fifth Commit"
[master 712c850] Fifth Commit
 1 file changed, 1 insertion(+), 1 deletion(-)
 
% git status
On branch master
nothing to commit, working tree clean

 

이제 gistory 에서 commit 확인

 

index 와 commit object의 파일명이 일치하고 내용이 변경된 부분을 확인 할 수 있다.

 

 

마지막으로 git working directory, index(stage), local repository , remote repository 의 관계를 도식화 하면 아래와 같다.

 

ref : https://stackoverflow.com/questions/3689838/whats-the-difference-between-head-working-tree-and-index-in-git
ref : https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified
ref : https://medium.com/@lucasmaurer/git-gud-the-working-tree-staging-area-and-local-repo-a1f0f4822018

 

내용이 도움이 되셨다면 블로그 구독하기 부탁드리겠습니다.

* 이 글의 모든 저작권은 aliceintr에 있으며 무단 배포 및 사용은 자제해 주시기 바랍니다. *

 

 

반응형

'DevOps > GIT' 카테고리의 다른 글

github#6 git merge conflict  (0) 2020.11.20
github#5 git HEAD file  (0) 2020.11.20
github#4 branch  (0) 2020.11.17
github #2 github reset  (0) 2020.11.16
github #1 github init, log, diff, add, status, commit  (0) 2020.11.15