중앙 저장소로 git 사용


12

나는 자신의 용도로 git을 설정 했으므로 '어디서나'에서 프로젝트에 액세스하고 여기 X 부분과 Y 부분을 작업하는 경우 버전 안전을 유지하고 필요한 경우 병합 할 수 있습니다.

그러나 내 개발 컴퓨터 중 하나에 만 고정 IP가 있습니다. 내 두뇌는 CVS 모드에 갇혀서 그 머신을 다른 모든 서버에서 가져 오는 '중앙'서버가되도록 git을 설정하려고했습니다.

이런 종류의 작품. '마스터'M에서 git-pull을 수행하는 많은 기계 AC가 있습니다. 데이터를 다시 보내려면 git push를 수행하십시오.

마스터에서 개발하면 문제가 발생합니다. 첫째, 중앙 저장소가 최신 버전을 제공하지 않고 얻는 방법을 알 수 없습니다.

git reset --hard HEAD

조금 과도하게 보입니다. 그리고 재설정하기 전에 중앙 시스템에서 개발을 수행하면 이미 푸시 된 변경 사항과 통합하는 방법을 모르겠습니다.

내 정신 모델에 대해 뭔가 벗어났다. 도움?


"마스터"라고 말하면 마스터 리포지토리 또는 마스터 브랜치에 대해 이야기하고 있습니까?
innaM

마스터 리포지토리
Alex Feinman 2009

1
자식 컨텍스트의 "마스터"는 일반적으로 기본 분기의 이름입니다.
innaM 2009

이것은 아마도 SO에 속할 것입니다
Ken Liu

답변:


30

중앙 저장소가 노출되기를 원합니다. 그것이 살고있는 기계의 이름이 static다음과 같이 말하십시오 .

$ ssh static git init --bare /git/myproject.git

이 베어 리포지토리는 중심의 약속 장소입니다. 개발이 아닌 추진을위한 것입니다.

중앙 저장소의 복제본에서 개발하십시오.

$ cd ~/src
$ git clone static:/git/myproject.git

에 있더라도 static복제본에서 작업하십시오.

$ git clone /git/myproject.git

이 저장소에서 작업하는 유일한 사람이지만 git documentation이 주제 분기 라는 작업을 수행하는 습관을 가지십시오 . 이것의 즉각적인 이점은 깨끗한 마스터를 유지한다는 것입니다. 즉 , 중앙 마스터 브랜치에서 병합하지 않고 항상 현재 로컬 리포지토리의 마스터로 가져올 수 있습니다.

예를 들면 다음과 같습니다.

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."

그것은 큰 일처럼 보이지 않을 수도 있지만 , 부분적으로 요리 된 상태에서 해당 지점표시된대로 프로젝트 자유롭게 떠날 수 있습니다. 이미 다른 지사에서 작업중 인 프로젝트의 다른 것을 깨는 것. 무한 무료 멀리건!

그날 밤 집에 가서 새로운 기능을 추가했을 수도 있습니다. 다음날 아침

$ git checkout master
$ git pull

중앙 리포지토리에있는 내용을 반영하도록 로컬 마스터를 업데이트합니다.

그러나 이제 foo 버그를 수정하여 마스터 브랜치에 포함 할 준비가되었다고 가정 해보십시오. 먼저 지난 밤의 변경 사항과 통합하려고합니다.

$ git checkout fix-bug-in-foo
$ git rebase master

rebase명령은 어젯밤의 새로운 기능 위에 foo 버그를 수정 한 것처럼 리포지토리를 표시합니다. (이것은 일종의 비슷 svn update하지만 더 유연하고 강력합니다.)

이제 중앙 마스터로 가져 오십시오.

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master

우리는 마스터를 특별하게 취급 해 왔지만 그것은 단지 종래의 것입니다. git 리포지토리를 통해 다른 리포지토리의 서로 다른 브랜치에서 작업을 쉽게 공유 할 수 static있습니다.


1
굉장한 대답은 당면한 모든 문제를 해결해줍니다.
Dan Loewenherz 2009

내 git 설치는 git init (이전 버전 ??) 옵션으로 --bare를 허용하지 않지만 기존 repo를 드러낸 다음 구성 파일을 수동으로 편집하여 해결했습니다.
Alex Feinman 2009

git 1.6.4.x를 실행하는 경우 git init --bare다른 인수가 없습니다. 설정된 경우 현재 작업 디렉토리 또는 GIT_DIR 환경 설정을 사용합니다. 디렉토리 인수를 취하려면 git 1.6.5.x가 필요하다고 생각합니다.
Darren Hall

4
그것은 내가 지금하고있는 일에 대해 지금까지 본 최고의 git 워크 플로우 설명입니다.
Greg Graham

8

경우 당신이 중앙 자식 저장소와 중앙 서버를 가지고, 그 저장소는해야한다 bare저장소. 베어 리포지토리에는 파일의 작업 복사본이 없습니다. 결과적으로 해당 중앙 시스템에서 작업하는 경우 중앙 리포지토리를 직접 사용하지 않고 로컬 클론을 사용하십시오.


6

이 답변은 gbacon의 답변 과 비슷 하지만 이미 로컬 리포지토리 설정이 있고 중앙 리포지토리로 취급되는 원격 마스터를 생성하려는 접근 방식을 취합니다. 다른 접근법에서 세부 사항을 추가하는 것입니다.

git을 사용하여 내 도트 구성 파일을 저장합니다. 나는 '중앙 저장소'라고 생각하는 것을 밀고 당긴다. 여러 컴퓨터를 통해 모든 도트 파일을 재설정하는 것이 매우 편리합니다.

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit

이렇게하면 repo 사이트에 비어있는 빈 저장소가 만들어졌습니다.

기존 리포지토리가 이미 로컬에 있으면 원격 사이트로 푸시 할 수 있습니다.

$ cd ~/src/dotconf

chdir을 로컬 디렉토리에 넣습니다.

$ git remote add origin ssh://example.com/~/dotconf.git

원격 저장소를 원점으로 추가하면 푸시 / 풀이 해당 저장소에 작용합니다.

$ git push origin master

마스터를 원점으로 밀어 넣으십시오 (이전에 git remote를 통해 레이블이 지정되어 있음). 이제 원격 저장소는 내 '중앙 저장소'로 취급됩니다. 내 모든 git push / pull은 원점과 상호 작용합니다.

다른 호스트로 가면 복제본을 통해 새로운 위치로 쉽게 가져올 수 있습니다.

$ git clone ssh://example.com/~/dotconf.git

원격 서버에서 개발을 수행하려면 먼저 복제 한 다음 베어 리포지토리로 푸시 / 풀하십시오.

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull

당신은 가능성이 설정해야 git config --add branch.master.remote origin하므로 git pull특정의 충분한 것을하지 않는 것을 불평하지 않습니다. 다른 대안은 마스터 브랜치를 --track원격 원점 으로 설정하는 것 입니다. 분기가 여러 개인 경우 유용합니다.


1

나는 오늘이 같은 문제를 연구하고있었습니다. 이 블로그 게시물 은이 문제에 대해 많은 토론을 가지고 있지만 대부분의 의견은 Manni의 말을하는 것입니다. David French의 게시물에 대한 의견에서 색인 또는 작업 트리에서 커밋되지 않은 작업이있는 저장소로 실수로 밀어 넣는 경우 수행 할 작업을 포함하여 다른 가능성에 대해 알아보십시오. "git reset –soft HEAD ^"는 작업을 방해하지 않고 푸시 된 변경을 취소합니다.


2
해당 블로그 게시물의 한 가지 문제점은 색인의 유용성을 건너 뛰는 것입니다. 다음은 git 대신 git으로 작업하는 방법을 설명하는 좋은 기사입니다 -osteele.com/archives/2008/05/my-git-workflow- 워크 플로 다이어그램이 포함되어 있습니다.
Darren Hall
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.