git hash-object -w --stdin의 --stdin옵션에 대하여..

이전글에서 글을 포스팅하다가 hash-object의 --stdin옵션이 정확히 어떤건지를 잘 모르겠어서 구글링과 오픈톡에 물어봤지만 원하는 답을 찾지 못했다.

이전글의 포스팅을 끝마칠때쯔음 git-scm: Git의내부-Git개체 두번째 예시에서 echo의 결과값이 아닌 이제 파일을 가지고 하는예제를 진행하다가 파일은 --stdin옵션을 붙히지 않는데 착안해서 뭔가 알거같은 느낌이 들어 여러가지 재밌는 실험들을 해보았다.

img-10

이렇게 아예 test.txt라는 파일을 생성하고나서 hash-object 명령어를 사용할때 –stdin옵션을 사용하지 않는것을 알수있었다.

첫번째, 폴더가 아닌 파일

이 글의 마지막 이 옵션이 없으면 파일 경로를 알려줘야 한다를 계속해서 읽어보니 처음에 나는 objects폴더에 저장을 못하는줄 알고 이 폴더와 관련이 있다고 생각을 했는데 폴더가 아니라 파일 경로라는것에 집중을 해보니 뭔가 실마리가 나왔다.

echo 'test content' | git hash-object -w --stdin

이 명령어 자체가 우선 echo의 결과물인 test content라는 내용을 git 의 hash-object로 git 데이터베이스에 저장을 하겠다는 건데 생각을 해보니 echo의 결과물은 파일이 아니라 그냥 출력물일뿐이었다.

git-scm에서 예시로 든 저 명령어에만 집중을 하니 파일을 hash-object로써 저장할수는 없을까? 라는 생각을 하지 못했고 그래서 해결책을 찾지 못하고 있다가 파이프 라인()과 stdin과의 관계를 검색해보았다.

두번째, 파이프라인에 대하여

파이프 라인이란 어떠한 프로그램의 출력 결과를 다른 프로그램의 입력 값으로 사용할때 사용하는 특수문자이다.

그러면 다시 위의 명령어를 아래에서 보자

echo 'test content' | git hash-object -w --stdin

파이프라인을 기준으로 왼쪽 명령의 stdout에서 나온 결과를 파이프 라인 기준 오른쪽의 명령어의 stdin으로 사용하겠다는 뜻이다.

이제 모든 의문점이 해결되었다.

stdout에서 나온 결과는 test content이며 이것을 git hash-object의 –stdin옵션으로 받아 hash-object로 만들어 주는것이다.

그러면 –stdin옵션 말고 파일로 해보면??

우선 첫번째로 stdin option이라는 내용을 가지는 test.txt파일을 만들어서 hash-object로 등록과 출력을 해보았다. 최대한 처음의 예제를 따라하기위해서 echo도 넣어봤는데 –stdin옵션이 빠진것을 확인할수 있다.

그런데 결과가 stdin option이라는 내용으로 나오는것을 확인할수 있으며 이 결과를 통해서 우리는 --stdin옵션이 필수가 아니라는것을 알수 있으며 다시 생각해보니 옵션인데 내가 왜 필수라고 생각을 했었는지 의문이다. 즉 여기서는 echo의 결과값이 git hash-object의 stdin으로 들어왔지만 –stdin옵션이 없기때문에 stdin에 있는 test라는 내용을 hash-object를 만드는데 사용하지 않았으며 test.txt라는 파일을 가지고 hash-object를 생성했다.

img-11

그러면 이제는 echo를 빼고 사용해보자

echo를 빼면 당연히 같은 결과가 나왔다. 이렇게 오늘 공부한 hash-object의 모든 의문이 풀렸다!