여러 git 저장소를 어떻게 구성하여 모두 함께 백업합니까?


98

SVN을 사용하면 서버에 보관하고 몇 대의 컴퓨터에서 체크 아웃 한 하나의 큰 저장소가있었습니다. 이것은 꽤 좋은 백업 시스템이었고 어떤 기계에서든 쉽게 작업 할 수있었습니다. 특정 프로젝트를 체크 아웃하고 커밋하고 '마스터'프로젝트를 업데이트하거나 전체를 체크 아웃 할 수 있습니다.

이제 다양한 프로젝트에 대한 git 저장소가 여러 개 있으며 그중 일부는 github에 있습니다. 또한 git-svn 명령을 통해 가져온 SVN 저장소도 있습니다.

기본적으로 저는 모든 코드 (프로젝트뿐만 아니라 임의의 스 니펫 및 스크립트, 내 이력서, 내가 작성한 기사, 내가 만든 웹 사이트 등)를 하나의 큰 저장소에 저장하는 것을 좋아합니다. 원격으로 쉽게 복제 할 수 있습니다. 컴퓨터 또는 메모리 스틱 / 하드 드라이브를 백업으로 사용합니다.

문제는 개인 저장소이기 때문에 git은 특정 폴더에서 체크 아웃하는 것을 허용하지 않는다는 것입니다 (별도의 프로젝트로 github에 푸시 할 수 있지만 변경 사항이 master-repo 및 하위 저장소에 모두 표시됨). repos)

내가 할 수 망할 놈의 서브 모듈 시스템을 사용하지만 (이것은 백업 쓸모 그래서, 서브 모듈은 다른 저장소에 대한 포인터, 정말 실제 코드를 포함하지 않는) 내가 너무 방법을 작동하지 않습니다

현재 git-repos 폴더 (예 : ~ / code_projects / proj1 / .git / ~ / code_projects / proj2 / .git /)가 있으며 proj1을 변경 한 후 git push github파일을 ~ /에 복사합니다. Documents / code / python / projects / proj1 / 및 단일 커밋을 수행합니다 (개별 리포지토리의 수많은 커밋 대신). 그런 다음 할 git push backupdrive1, git push mymemorystick

그래서 질문 : git 저장소를 사용하여 개인 코드와 프로젝트를 어떻게 동기화하고 백업합니까?

답변:


74

나는 것이다 강력하게 주어진 Git 저장소에 관련이없는 데이터를 퍼팅에 대해 조언한다. 새로운 리포지토리를 생성하는 오버 헤드는 매우 적으며, 이는 서로 다른 계보를 완전히 분리 할 수 있는 기능 입니다.

이 아이디어에 맞서 싸우는 것은 불필요하게 얽힌 역사로 끝나는 것을 의미하며, 이는 결과적으로 희석으로 인해 행정을 더 어렵게 만들고, 더 중요한 것은 "고고학"도구의 ​​유용성을 떨어 뜨립니다. 또한 앞서 언급했듯이 Git은 "복제 단위"가 저장소라고 가정하고 분산 특성 때문에 실제로 그렇게해야합니다.

한 가지 해결책은 모든 프로젝트 / 패키지 / 등을 유지하는 것입니다. 그 자체로 베어 처럼, 축복받은 계층에서 (나무 작업없이 즉,) 저장소 :

/repos/a.git
/repos/b.git
/repos/c.git

몇 가지 규칙이 설정되면 전체 계층 구조에 관리 작업 (백업, 패킹, 웹 게시)을 적용하는 것이 간단 해집니다. 이는 "모 놀리 식"SVN 저장소와 완전히 다르지 않은 역할을 수행합니다. 이러한 리포지토리로 작업하는 것도 SVN 워크 플로와 다소 유사 해지며 로컬 커밋 및 분기를 사용할 있습니다.

svn checkout   --> git clone
svn update     --> git pull
svn commit     --> git push

여러 당사자 간의 손쉬운 동기화를 위해 각 작업 클론에 여러 원격을 가질 수 있습니다.

$ cd ~/dev
$ git clone /repos/foo.git       # or the one from github, ...
$ cd foo
$ git remote add github ...
$ git remote add memorystick ...

그런 다음 각 "소스"에서 가져 오거나 가져 와서 로컬에서 작업하고 커밋 한 다음 다음과 같은 작업이 준비되면 각 원격으로 푸시 ( "백업") 할 수 있습니다 ( 동일한 커밋 및 히스토리를 각각의 리모컨!) :

$ for remote in origin github memorystick; do git push $remote; done

기존 작업 저장소 ~/dev/foo 를 베어 저장소로 바꾸는 가장 쉬운 방법은 다음 과 같습니다.

$ cd ~/dev
$ git clone --bare foo /repos/foo.git
$ mv foo foo.old
$ git clone /repos/foo.git

이는 대부분 a와 동일 svn import하지만 기존의 "로컬"히스토리를 버리지는 않습니다.

참고 : 하위 모듈 은 공유 관련 계보 를 포함하는 메커니즘 이므로 실제로 해결하려는 문제에 적합한 도구라고 생각하지 않습니다.


18
많은 별도의 리포지토리로 끝나고 모든 저장소를 관리하는 데 도움이되는 간단한 스크립트를 작성한다는 사실은 git에 뭔가 빠진 것이 있다는 느낌을줍니다. 나는 그것이 무엇인지 또는 그것에 대해 무엇을 해야할지 정확히 결정할 수 없습니다.
DonGar

글쎄, 당신도 많은 개별 프로젝트를 관리합니까? 프로젝트와 리포지토리 간의 일대일 관계는 분산 된 세계에서 합리적으로 느껴지지만 백업 및 관리의 용이성을 위해 여전히 공통 디렉토리 트리에 베어 리포지토리를 배열 할 것입니다. (즉, Git / Hg / Bzr을 사용하면 프로젝트 작업과 관리를 분리해야하는 반면 대부분의 SVN 워크 플로는 두 가지를 통합합니다. 이제 사람들이 관리 부분을 GitHub 또는 다른 공급자에게 위임하는 것이 일반적입니다.)
Damien Diederen

2
이 아이디어는 자신의 프로젝트를 호스팅하거나 모두 오픈 소스 인 경우에만 의미가 있습니다. 그렇지 않으면 당신은 당신이 비용이 많이 드는 얻을 수있는 무제한의 민간 프로젝트 필요 GitHub의에 필요
dkinzer

2
"for remote in origin github memorystick; do git push $ remote; done"대신 단일 명령으로 여러 원격 장치에 푸시하도록 특수 원격을 구성 할 수도 있습니다. stackoverflow.com/questions/36862/… . (어떤 경우에는 더 편리 할 수 있습니다.)
IMZ - 이반 Zakharyaschev

2
누락 된 것은 git이 하위 트리별로 객체를 분리하여 보관할 수있는 방법이라고 생각합니다. 따라서 단일 "저장소"가 분리 가능한 단위 (나머지없이 개별적으로 다운로드 됨)를 통해 개별적으로 동기화되어 사람들이 특정 작업을 수행 할 수있는 방식으로 구성 될 수 있습니다. 나머지 부분에 대해 알지 못합니다.
peterk 2010 년

28

그가 추천 하는 Damien의 답변 에 추가하고 싶습니다 .

$ for remote in origin github memorystick; do git push $remote; done

하나의 명령으로 모든 개별 실제 리모컨으로 푸시하도록 특수 리모컨을 설정할 수 있습니다. http://marc.info/?l=git&m=116231242118202&w=2 에서 찾았습니다 .

따라서 "git push"(동일한 분기를 여러 번 푸시하는 것이 합리적 임)의 경우 실제로 수행 할 수 있습니다.

  • .git / config에는 다음이 포함됩니다.

    [remote "all"]
    url = master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
    url = login.osdl.org:linux-2.6.git
    
  • 이제 git push all master"마스터"분기를
    원격 저장소 모두 에 푸시 합니다.

참조를 사용하여 URL을 두 번 입력 할 수도 있습니다.

[url "<actual url base>"]
    insteadOf = <other url base>

3

나는 또한 이것을 처리하는 제안 된 방법에 대해 궁금하고 내가 사용하는 현재 설정 (SVN과 함께)을 설명 할 것입니다. 기본적으로 자체 bin 및 lib 디렉토리를 포함하는 미니 파일 시스템 계층 구조를 포함하는 저장소를 만들었습니다. 이 트리의 루트에는 이러한 bin, lib 등 다른 디렉토리를 적절한 환경 변수에 추가하도록 환경을 설정하는 스크립트가 있습니다. 따라서 루트 디렉토리는 기본적으로 다음과 같습니다.

./bin/            # prepended to $PATH
./lib/            # prepended to $LD_LIBRARY_PATH
./lib/python/     # prepended to $PYTHONPATH
./setup_env.bash  # sets up the environment

이제 / bin 및 / lib 안에는 여러 프로젝트와 해당 라이브러리가 있습니다. 나는 이것이 표준 프로젝트가 아니라는 것을 알고 있지만, 내 그룹의 다른 누군가가 저장소를 체크 아웃하고 'setup_env.bash'스크립트를 실행하고 로컬에서 모든 프로젝트의 최신 버전을 보유하는 것은 매우 쉽습니다. 점검. 그들은 / usr / bin 또는 / usr / lib의 설치 / 업데이트에 대해 걱정할 필요가 없으며 여러 체크 아웃과 체크 아웃 당 매우 지역화 된 환경을 간단하게 유지합니다. 누군가는 또한 전체 저장소를 rm하고 프로그램 제거에 대해 걱정할 필요가 없습니다.

이것은 우리에게 잘 작동하며 우리가 그것을 바꿀지 확실하지 않습니다. 이것의 문제는 하나의 큰 저장소에 많은 프로젝트가 있다는 것입니다. 이와 같은 환경을 만들고 프로젝트를 자체 저장소로 나누는 git / Hg / bzr 표준 방법이 있습니까?


3

, 나는 내가 필요한 상황에 부딪히지 않았기 때문에 아직 git 저장소를 중첩하려고 시도하지 않았습니다. #git 채널 에서 읽은 것처럼 git은 저장소를 중첩하여 혼란스러워하는 것 같습니다. 즉, git 저장소 내에서 git-init를 시도하고 있습니다. 중첩 된 git 구조를 관리하는 유일한 방법은 git-submodule또는 Android의 repo유틸리티를 사용하는 것입니다.

설명하는 백업 책임에 관해서는 위임 이라고합니다. 저는 일반적으로 IT 기술자가 백업 전략에 따라 정기적으로 백업하는 작업중인 네트워크 드라이브에 각 프로젝트의 "원본"저장소를 배치합니다. 선택. 간단하고 걱정할 필요가 없습니다. ;)


2

한 번에 여러 Git 리포지토리를 관리하기 위해 mr 를 사용하는 것은 어떻습니까?

mr (1) 명령은 하나의 결합 된 저장소 인 것처럼 저장소 세트에서 체크 아웃, 업데이트 또는 기타 작업을 수행 할 수 있습니다. Subversion, git, cvs, mercurial, bzr, darcs, cvs, vcsh, fossil 및 veracity 저장소의 모든 조합을 지원하며 다른 개정 제어 시스템에 대한 지원을 쉽게 추가 할 수 있습니다. [...]

간단한 쉘 스크립팅을 통해 매우 구성 할 수 있습니다. 다음과 같은 작업을 수행 할 수 있습니다.

[...]

  • git 저장소를 업데이트 할 때 두 개의 다른 업스트림에서 가져 와서 두 개를 함께 병합하십시오.
  • 여러 저장소 업데이트를 병렬로 실행하여 업데이트 프로세스의 속도를 크게 높입니다.
  • 노트북이 오프라인 상태로 인해 실패한 작업을 기억하여 다시 온라인 상태가되면 다시 시도 할 수 있습니다.

1

중첩 된 git repos를 갖는 또 다른 방법이 있지만 문제를 해결하지 못합니다. 그래도 솔루션을 찾는 다른 사람들에게는 다음과 같습니다.

최상위 git repo에서는 중첩 된 git repo가 ​​포함 된 .gitignore의 폴더를 숨 깁니다. 이렇게하면 두 개의 분리 된 (하지만 중첩 된!) git repos를 쉽게 가질 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.