불안정한 연결에서 큰 프로젝트를 위해 git clone을 완료하는 방법은 무엇입니까?


193

LibreOffice 코드베이스를 git clone하려고하지만 현재 약 300kbps의 인터넷 연결이 있으며 안정적입니다. 언제든지 연결을 다시 얻을 수 있지만 git clone 프로세스가 이미 작동을 멈추고 다시 실행할 수있는 방법이 없습니다. 더 고장 방지 git clone 다운로드를 할 수있는 방법이 있습니까?

내가 생각한 한 가지 옵션은 다른 사람의 .git 디렉토리를 다운로드하는 것이지만 다른 사람에게 지나치게 의존적이며 가장 좋은 해결책은 아닙니다.


6
모든 개정판을 복제해야합니까, 아니면 최신 버전입니까? 아마도 depth -1해결책일까요?
takeshin

1
번들 접근 방식은 이미 repos와 같은 위치에 kernel/git/torvalds/linux.git있습니다. 그리고 재개 가능한 git clone에 대해 논의 중입니다 (2016 년 3 월). stackoverflow.com/a/29192890/6309를 참조하십시오 .
VonC

궁금하다. 일을하지 않음 git init, 원격 설정 한 후 트릭을 할 성공할 때까지 가져올거야? 연결이 실패하면 가져 오기가 성공적으로 다운로드 된 객체를 버리지 않는다고 생각합니다.
Андрей Беньковский

@ АндрейБеньковский 이것을 시도한 사람이 있습니까?
William Entriken

답변:


71

아직 준비가되지 않았다고 생각합니다. 거기에 오래된 GSoC 페이지 원하는 기능을 구현하는 계획이. 최선의 방법은 디렉토리로 다운로드하는 것이 좋습니다. 다른 프로토콜을 통해 다운로드를 다시 시작할 수 있다고 가정합니다.

재시작 가능한 클론

대규모 저장소 (예 : KDE, Open Office, Linux 커널)를 복제 할 때는 현재 중단 된 복제본을 다시 시작할 수있는 방법이 없습니다. 작은 파이프 끝에있는 사용자가 데이터를 다운로드하는 데 상당한 시간이 걸릴 수 있으며 복제가 중간에 중단 된 경우 사용자는 현재 처음부터 다시 시작하고 다시 시도해야합니다. 일부 사용자의 경우 큰 저장소를 복제하지 못할 수 있습니다.

목표 : git-clone이 기본 git : // 프로토콜을 통해 이전에 실패한 다운로드를 자동으로 다시 시작하도록 허용합니다. 언어 : C 멘토 : Shawn Pearce 제안 : gmane의 Shawn Pearce


최신 정보

git clone --depth=1다른 답변 중 하나의 얕은 복제 ( ) 제안과 함께 공급자와 통신 할 수있는 누군가가 당신을 위해 베어 리포지토리를 만들 수 있다면 도움이 될 수 있습니다. Bare 저장소를 전체 저장소 쉽게 변환 할 수 있습니다 . 또한 얕은 클론이 항상 도움이되지 않을 수 있으므로 해당 답변의 주석을 읽으십시오.


정보 주셔서 감사합니다, 그래서 내 문제가 알려져 솔루션이 해결되었습니다 ... 해결 방법으로 무엇을 추천 하시겠습니까?
LaPingvino

9
어제,이 문제 때문에 600 루피를 잃었습니다 ($ 10). 인터넷 대역폭은 전 세계에서 매우 귀중한 것입니다.
Amit Singh Tomar

2
많은 사람들이 업데이트를 요청하고 아무도 솔루션에 대한 기여를 공유하지 않습니다.
윌리엄 Entriken

2
Mar'18-아직도 그것을 위해 lukin. ..이 지구상에서!!
earthling

3
11 년 후 구글 파이버 (Google Fiber)와 구글 파이 (Google Fi)의 신뢰할 수없는 대역폭이라는 사회 경제적 문제에 대한 구글의 공격은 다양한 결과를 낳았다. 루이빌시의 섬유 미세 트렌치 는 아스팔트로 너무 얕게 절단 되었으며, 작업 후 곧 노면에서 케이블이 튀어 나오는 것을 발견했습니다. 한편, --depth 1--unshallow나타납니다은 사용의 년 버텨 가지고 있습니다.
rwong

126

생각 나는 두 가지 솔루션 (또는 차선책 )은 다음과 같습니다.

  • 사용 얕은 클론git clone --depth=1, 다음 심화 이 복제 사용 git fetch --depth=N증가와 함께, N을 . git fetch --unshallow(1.8.0.3부터)를 사용 하여 나머지 모든 개정판을 다운로드 할 수 있습니다 .

  • 누군가에게 태그가 지정된 릴리스까지 번들묶으 라고 요청 하십시오 ( git-bundle (1) 맨 페이지 참조). 번들 자체는 일반 파일이며, 이력서 지원이있는 HTTP / FTP, BitTorrent, rsync 등을 통해 어떤 방식 으로든 다운로드 할 수 있습니다. 번들에서 복제본을 생성하고 구성을 수정하며 공식 LibreOffice 저장소에서 추가 페치를 수행 할 수 있습니다. .


3
얕은 복제 트릭은 실제로 잘 작동하지 않습니다. 잘 포장 된 저장소 (git : //libvirt.org/libvirt.git)를 복제하면 68M 전송이 61M + 35M 전송으로 변경됩니다. 깊이 1의 모든 분기가 아닌 작업 트리의 우선 순위를 지정하는 기능이 더 좋습니다. 세션 재개가 여전히 더 좋습니다.
Tobu

1
@Tobu : 얕은 복제 트릭은 lonG 히스토리가있는 저장소에서 작동 할 수 있습니다. 얕은 클론이 기본적으로 단일 브랜치 만 갖도록하는 작업이 진행 중입니다. 도움이되었을 수도 있습니다. 아님
Jakub Narębski

6
이것은 git 1.7.10에서 실제로 잘 작동합니다 . Git 리포지토리의 초기 depth = 1 클론은 4.72Mb에 불과하고 전체 리포지토리는 55Mb입니다. 추가 가져 오기는 원하는만큼 작을 수 있습니다 (depth = 100은 ~ 20Mb 가져 오기). 전체 압축 된 다운로드는 31Mb, 하나의 클론과 3 개의 페치에서 발생했습니다.
naught101 년

2
@ naught101 그것은 하나의 개정을 위해 객체를 다운로드하고 소스 코드 자체가 크면 (히스토리가 아니라면) 다시 문제가 될 것입니다.
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];done나를 위해 일했다, 감사합니다! :)
Trass3r

15

이 방법은 타사 서버를 사용합니다.

먼저, 않습니다 git clone --bare, 다음 rsync -v -P -e ssh user@host:repo.git . 당신은 Windows에서 MSYS를 사용할 수 있습니다.


나는 그것이 repo.git 내부 .git 내부 파일의 예상 내용을 생성, --bare 옵션을 시도, 나는 자식 복제 파일해야 할 일을했을 : 실제 저장소를 얻을 수 ///path/to/repo.git/을
PiyusG

1
Linus "제 3 자 서버"라는 GitHub를 소유하고 있지 않습니다. 실제로 " rsync(1) GitHub가 내가보고있는 방식으로 사용자의 사용을 금지 할 정도로 사용자를 너무 많이 수감하지 않는 Git 서버"를 의미 했습니까? 또는, 당신은 처음에 뜻 git clone 제 3 자 서버와 다음 로컬 컴퓨터에 rsync는?
JamesTheAwesomeDude


9

"다른 사람의 .git 디렉토리를 다운로드"할 수 있지만 다른 사람이 공식 저장소 자체가 될 수 있습니다. LibreOffice 리포지토리는 http를 통해 사용할 수 있습니다 (예 build.git: http://anongit.freedesktop.org/git/libreoffice/build.git/) ( 전체 목록 은 http://cgit.freedesktop.org/libreoffice/ 참조) . http URL은 각 저장소 페이지의 맨 아래에 있습니다.

이 http URL에서 볼 수있는 것은 .git디렉토리 (실제로는 .git디렉토리 에서 찾을 수있는 "베어"저장소)에 지나지 않습니다 . git://프로토콜 서버 ( git daemon) 와 동일한 디렉토리 입니다. 웹 다운로더 (예 wget -m -np:)를 사용하여 이러한 디렉토리의 사본을 작성하는 경우 사본에서 복제 할 수 있으며 http 저장소에서 직접 복제 한 것처럼 작동합니다.

따라서 할 수있는 일은 다음과 같습니다. 각 리포지토리마다 좋아하는 웹 다운로더 (복수 다운로드 재개와 관련된 모든 문제를 처리)와 함께 사본을 가져 와서 해당 사본에서 복제하십시오. 업데이트하려면 좋아하는 웹 다운로더를 다시 사용하여 복사본을 업데이트하고 해당 복사본에서 가져옵니다. 이제 복제본과 업데이트는 좋아하는 웹 다운로더와 마찬가지로 잘못된 연결에 내성을 갖습니다.


그들은 단지 하나의 저장소로 변환했습니다. 팁 wget이 사이트를 한 번에 다운로드하기로 결정했습니다 ... (다시 시도하면 나중에 여기에서 업데이트 될 것입니다 ...)
LaPingvino

귀하의 명령은 사이트의 모든 링크를 가져 오는 것 같습니다. : 여기 작동하는 것 같다 스크립트를 작성하는 의지 gist.github.com/1307703을 초기 아이디어를 많이, 어쨌든 감사합니다!
LaPingvino

재미있는 아이디어, github에서 ruby ​​/ ruby ​​repo를 얻으려고하는데 robots.txt에 의해 차단되고 있습니다 ... 제안 사항이 있습니까?
hanetzer December

6

git clone구성 요소 부분으로 분류하고 git checkout파일 다시 다운로드를 방지 하는 데 사용 합시다 .

git clone실행할 때 처음 몇 가지 작업은

git init
git remote add origin <repo_url>
git fetch origin <branch>

위 단계를 수동으로 실행하고 올바르게 완료되었다고 가정하면 필요한만큼 다음을 실행할 수 있습니다.

git checkout --force <branch>

실행 될 때마다 모든 파일을 체크 아웃하지만 파일을 다시 다운로드 할 필요가 없으므로 시간을 절약 할 수 있습니다.


1
설명 된 방식으로 작동하지 않습니다. 페치가 손상된 후 git reset을 수행 할 수 없습니다.
MaikoID

내가 말했듯이 가져 오기가 성공적으로 완료되었다고 가정하면 git reset을 실행할 수 있습니다. 가져 오기가 실패하면 재설정이 작동하지 않습니다. A) 작동 할 때까지 반복적으로 다시 가져 오거나 B) 이것을 버리고 다른 것을 시도해야합니다.
cowlinator

나는 기적적으로 일한 다른 일을했습니다. git fetch =) 대신 git pull을 수행했습니다.
MaikoID

내가 명령이 차이를 만든 NED해야하므로 자식 풀 다만, 다음 병합을 내부적으로 가져 GIT 호출하고 생각 @MaikoID
lucidbrot

4

타사 서버에 액세스 할 수 있으면 해당 서버를 복제 한 다음 복사 할 수 있습니다.


4
git clone --depth <Number> <repository> --branch <branch name> --single-branch

이 명령은 나를 도와줍니다 ( Nicola Paolucci 에게 감사드립니다 )

예를 들어

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch

4

클론 / 깊이 기반 답변을 기반으로-몇 줄의 bash가 쉽게 완료됩니다 ...

git clone --depth=1 something@somegit.com:/var/git/whatever.git <directory> cd <directory> for m in `seq 1 100`;do git fetch --depth=$m;done


고마워, 그것은 효과가있는 것 같습니다 .Arduino를 복제하려고하는데 약 800MB로 25 %에 달했고 충돌했습니다. 부분으로 다운로드하는 것이 더 안전 해 보이지만 1 단계 일 필요는 없습니다. 업데이트 방법에 따라 10 또는 50이 더 좋을 것입니다. 파일 8 만 개를 상상해보십시오. 사용 : mseq 1 10 1000 ; 않는 자식 풀 --depth = $ m, 나는 Ctrl 키 + CI는 현재 패키지를 분실 할 경우 10 PS의 단계를 얻기 위해 수행하고 다시 시작할 수 있습니다
user3394963

3

이 문제도 저를 물었습니다. 내 경우에는 해결 방법이 있습니다. 귀하의 경우에는 적용되거나 적용되지 않을 수 있습니다.

때로는 원격 시스템에서 git 작업을 시작하기 위해 휴대 전화를 사용하고 있습니다. 물론 Wi-Fi가 끊어지면 세션이 종료되고 git은 복구하지 않고 전체 복제 작업을 중단합니다. 그러나 원격 시스템에서 git master 로의 인터넷 연결이 안정적이므로 복제를 중지 할 필요가 없습니다. 터미널 세션에서 클론을 분리하는 상식 만 있으면됩니다. screen / tmux 또는 nohup / daemon을 사용하여 수행 할 수 있습니다. 제 경우에는 라이브웨어 오작동입니다.



2

CNTRL Z를 사용하여 복제를 중지하십시오. 터미널을 닫지 말고 시스템 / 노트북을 최대 절전 모드로 설정 한 다음 fg 명령으로 나중에 계속하십시오. repo frm github를 복제하려고 할 때 오늘이 같은 문제에 직면했습니다. 이것은 나를 위해 시간 절약으로왔다.


2

버퍼 크기를 늘리면이 문제에 도움이됩니다. 단계를 따르십시오.

단계 :

1. 터미널 또는 Git Bash를 열고 "cd"를 사용하여 저장소를 복제하려는 위치로 이동하십시오.

2. 압축을 0으로 설정

git config --global core.compression 0

3. postBuffer 크기 설정

git config --global http.postBuffer 1048576000

4.maxRequestBuffer 크기 설정

git config --global http.maxRequestBuffer 100M

5. 지금 복제 시작

git clone <repo url>

복제가 완료 될 때까지 6.Wait.

감사합니다. 행복한 코딩!


이것은 분명히 받아 들여질만한 대답이어야합니다. 문제를 해결합니다.
SuperEye

1

여기에 5 센트를 넣고 싶습니다. 이것은 실제로이 문제를 해결하는 데 도움이되었습니다.

  • 압축 해제
  • http.postBuffer 증가
  • 부분 복제를하다
  • 복제 된 디렉토리로 이동하여 나머지 복제본을 가져옵니다.
  • 나머지를 당겨
git config --global core.compression 0
git config --global https.postBuffer 524288000
git clone  <your_git_http_url_here> --depth 1
git fetch --unshallow 
git pull --all

이것은 8Mbps adsl 연결을 통해 ~ 3GB의 repo를 복제하는 데 도움이되었습니다. 물론 가져 오기를 수행하고 몇 번 가져와야했지만 여전히 ...


0

우리는 서버의 대역폭이 양호하고 서버가 있다고 가정하면 다른 대답은 다음과 같습니다.

  1. Server-Side Git Wrapper를 사용하여 자신의 서버 만들기 '들
  2. 서버에서 복제
  3. 이 서버 측을 사용하여 우편 아카이브 우편 번호 '들
  4. Server-Side Resume 지원 과 함께 다운로드하십시오

그러나 이것은 매우 기본적인 웹 개발 경험과 함께 작동합니다) 또한이 필요 git.exe귀하의 단절에


0

같은 문제가 있습니다-나는 종종 10-15 kb / sec를 넘지 않는 인터넷 연결을 가지고 있습니다 :-P

나를 위해 wget 방식이 잘 작동했습니다. "복제 또는 다운로드"녹색 버튼이있는 저장소 사이트로 이동하여 클릭 한 다음 ZIP 다운로드 옵션의 링크를 복사하십시오.

그런 다음 wget 명령에 대한 링크를 삽입하십시오.
wget -c -m -np https://github.com/your/repository/archive/master.zip

매력처럼 작동합니다 ...


0

나를 위해 일한 가장 좋은 해결 방법 :

인터넷 연결이 좋지 않은 것과 동일한 문제에 직면했습니다. 그래서 다음 해결책을 생각해 냈습니다.

패키지를 zip 파일로 다운로드하기 위해 서버에 작은 PHP 파일을 만들었습니다.

<?php
$url = "https://codeload.github.com/CocoaPods/Specs/zip/master";
file_put_contents("coco.zip", fopen($url, 'r'));
?>  

<a href="coco.zip">coco.zip</a>

그런 다음 이력서를 지원하는 다운로드 관리자를 사용하여 zip 파일을 다운로드하십시오.


-1

hg-git 확장명과 함께 수은을 사용할 수 있습니다.

그래도 작동하지 않으면 git fetch <commit-id>원격 git 저장소의 일부만 가져 오는 데 사용할 수 있습니다 (빈 git 저장소로 가져올 수는 있지만 복제본으로 만들 필요는 없습니다). 그러나이 방법을 사용하면 지점 구성을 수정 (= 로컬 및 원격 추적 지점 생성) 할 수 있습니다.

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