전체 저장소를 git 번들로 묶는 방법


116

전체 저장소를 네트워크에 연결되지 않은 새 시스템 (단일 파일 엔티티로 선호 됨)으로 전송해야합니다. git 번들은 sneakernet 환경에서 git fetch, git pull스타일 작업을 허용 하지만 대상 머신에 이미 작동중인 저장소 버전이 있다고 가정하는 것으로 보입니다.

다음에 대한 올바른 호출은 무엇입니까?

  1. 현재 저장소의 모든 분기를 번들로 묶습니다.
  2. 대상 디렉토리에서 새 저장소를 시작합니다. 즉, 루트 커밋을 올바르게 설치합니다.

명확히하기 위해 패치 업스트림을 보냈습니다.

`git clone` can use any bundle created without negative refspecs
(e.g., `new`, but not `old..new`).
If you want to match `git clone --mirror`, which would clone other
refs such as `refs/remotes/*`, use `--all`.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use `--branches --tags` for
the `<git-rev-list-args>`.

따라서 $ git bundle create repo.bundle --branches --tags복제에 가장 적합합니다.

$ git bundle create repo.bundle --all 원격 참조를 포함하여 소스 머신의 미러 이미지를 제공합니다.

답변:


190

다음에 대한 올바른 호출은 무엇입니까?

  • 현재 저장소의 모든 분기를 번들로 묶습니다.

단순한:

$ git bundle create repo.bundle --all

여기 repo.bundle만들려는 번들 파일의 이름입니다. 참고 --all단지 일반 복제와 같게 않을 것 ... 원격 추적 브랜치를 포함하지 않을 것입니다.

  • 대상 디렉토리에서 새 저장소를 시작합니다. 즉, 루트 커밋을 올바르게 설치합니다.

첫째, clone그냥 init+ fetch(+ administrativia).

둘째, 저장소 URL을 사용할 수있는 모든 곳에서 번들 파일을 사용할 수 있으므로 간단히 clone번들 파일에서 사용할 수 있습니다 .

$ git clone repo.bundle

이것은 repogit 저장소로 생성 됩니다.


6
감사합니다. --all옵션은 내 man 페이지에 없습니다 bundle(버전 1.7.6.msysgit.0보고 있음), URL 섹션의 .bundle 파일 사용도 clone. 사용을 추천하는 것이 더 큰 자신감을줍니다.
Philip Oakley 2012 년

20
create 명령 의 개요 는 git bundle create <file> <git-rev-list-args>입니다. 실행 man git-rev-list(또는 man git-log)하면 --all. 그러나 번들 명령 문서에서 더 잘 보이도록 동의합니다.
Jakub Narębski

1
참조 지정 아래에있는 번들 맨 페이지에 git show-refgit-rev-list 옵션이 [list] 포함되지 않은 " 로 표시되는 참조 만 패키지화됩니다 "라고 표시되어 있습니다.
Philip Oakley

2
@Philip Oakley : 명령 으로 표시되는 참조 git-rev-list-args선택 하는 방법 git show-ref입니다.
Jakub Narębski

2
--all나를 위해 원격 추적 분기를 포함했습니다 (git 2.1.4). 내가 볼 수 refs/remotes/origin/*git bundle list-heads bundlefilegit ls-remote bundlefile. 번들에서 다시 가져 오는 것은 약간 까다 롭습니다.
Alex

33

먼저 저장소를 복제하고 --mirror옵션을 포함합니다 .

git clone --mirror git@example.org:path/repo.git

이렇게하면 모든 원격 분기가 번들링 할 준비가 된 로컬 분기가됩니다.

그런 다음 실행

git bundle create repo.bundle --all Jakub Narębski의 답변에 설명 된대로


3

.git 폴더를 tar 또는 zip하고 새 위치에서 압축을 푼 다음 git reset --hard HEAD. 모든 브랜치에 필요한 모든 것은 .git 아래에 있으며 .git / config 파일에서 원격을 조정하거나 제거하기 만하면됩니다.

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD

4
한 가지주의 할 점은 .git / config 파일을보고 원래 저장소 소유자가 거기에 사용자 특정 항목이 있는지 확인해야한다는 것입니다.
Noufal Ibrahim

@patthoyts : 연결이 끊어 졌다는 점을 감안할 때 리모컨이 없을 것입니다 ;-) 번들에 옵션이 누락 된 것 같고 복제 (번들에서 복제하는 것에 대해 생각해야 함)
Philip Oakley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.