Mercurial에서 일반적으로하는 것과 같이 특정 개정으로 git 저장소를 복제하는 방법은 무엇입니까?
hg clone -r 3 /path/to/repository
Mercurial에서 일반적으로하는 것과 같이 특정 개정으로 git 저장소를 복제하는 방법은 무엇입니까?
hg clone -r 3 /path/to/repository
답변:
업데이트 2 Git 2.5.0 부터 아래에 설명 된 기능은 서버 측에서 구성 변수를 사용하여 활성화 할 수 있습니다 uploadpack.allowReachableSHA1InWant
. 여기서 GitHub 기능 요청 및 GitHub 커밋은이 기능을 활성화합니다 . 일부 Git 서버는 기본적으로이 옵션을 활성화합니다 (예 : Bitbucket Server는 버전 5.5 이상 부터 활성화했습니다) . 구성 옵션을 활성화하는 방법에 대한 자세한 내용 은 Stackexchange 에서이 답변을 참조하십시오 .
업데이트 1 Git 버전의 1.7 < v < 2.5
경우 Vaibhav Bajpai의 답변에 설명 된대로 git clone 및 git reset을 사용하십시오.
전체 저장소를 가져 오지 않으려면을 사용하지 않아야합니다 clone
. 항상 가져 오기를 사용하여 가져올 분기를 선택할 수 있습니다. 나는 hg 전문가가 아니므로 세부 사항을 -r
모르지만 git에서는 이와 같은 것을 할 수 있습니다.
# make a new blank repository in the current directory
git init
# add a remote
git remote add origin url://to/source/repository
# fetch a commit (or branch or tag) of interest
# Note: the full history up to this commit will be retrieved unless
# you limit it with '--depth=...' or '--shallow-since=...'
git fetch origin <sha1-of-commit-of-interest>
# reset this repository's master branch to the commit of interest
git reset --hard FETCH_HEAD
git fetch origin <sha1>
합니다. 태그 또는 분기 이름과 같은 명명 된 참조를 전달해야하는 것 같습니다. 참조 kerneltrap.org/mailarchive/git/2009/1/13/4707444
git fetch origin <SHA1>
하면 원격에서 마스터를 가져 와서 reset --hard
실제로 로컬로 분기를 인스턴스화 한 후 원하는 개정으로 전환 할 수 있음을 알았습니다 . 개별 개정판을 직접 가져올 수 없었습니다. git 1.7에서는 git fetch origin <SHA1>
@artur 가보고 한대로 작동하지 않았습니다. git checkout <SHA1>
뒤에을 사용해야 합니다 reset --hard
.
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
가장 최근의 커밋으로 다시 돌아가려면
$ git pull
--depth
큰 저장소에 매우 중요한 것을 사용할 수 있기 때문 입니다. 이 솔루션을 사용하려면 모든 객체를 가져온 다음 이전 버전으로 재설정해야합니다. 이것은 시간이 많이 걸리고 낭비되는 네트워크 대역폭입니다.
git 리포지토리를 복제하면 전체 리포지토리가 복제됩니다. 복제 할 리비전을 하나만 선택할 수있는 방법은 없습니다. 그러나 일단 수행 한 후에는을 수행 git clone
하여 특정 개정을 체크 아웃 할 수 있습니다 checkout <rev>
.
git clone --single-branch ...
특정 브랜치 또는 태그에서 하나의 특정 커밋 만 복제하려면 다음을 사용하십시오.
git clone --depth=1 --branch NAME https://github.com/your/repo.git
불행히도, NAME
분기 이름 또는 태그 이름 만 될 수 있습니다 (SHA를 커밋하지 않음).
--depth
플래그를 생략하여 전체 히스토리를 다운로드 한 후 해당 분기 또는 태그를 체크 아웃하십시오.
git clone --branch NAME https://github.com/your/repo.git
이것은 최신 버전의 git에서 작동합니다 (버전으로했습니다 2.18.0
).
처음부터 특정 지점까지 모든 것을 가져오고 싶다면 Charles Bailey의 대답이 완벽합니다. 반대로하고 현재 날짜부터 되돌아온 기록의 하위 세트를 검색하려면 다음을 사용할 수 있습니다.git clone --depth [N]
여기서 N은 원하는 기록의 수입니다. 하나:
--깊이
지정된 수의 개정판으로 기록이 잘린 얕은 복제본을 만듭니다. 얕은 저장소에는 여러 가지 제한이 있지만 (복제하거나 가져올 수 없으며, 밀어 넣거나 넣을 수는 없습니다), 오랜 역사를 가진 대규모 프로젝트의 최근 기록에만 관심이 있고 적절할 경우 적합합니다. 수정 사항을 패치로 보내십시오.
요약하면 (git v. 1.7.2.1) :
git clone
당신이 repo를 원하는 곳 에서 규칙적으로 행동하십시오.git checkout <sha1 rev>
당신이 원하는 rev의git reset --hard
git checkout -b master
master
이를 전환합니다.
git reset --hard
? 이에 대한 문서는 "인덱스 및 작업 트리를 재설정합니다. <commit> [이제 기본값은 HEAD (현재는 현재) 임) 이후 작업 트리에서 추적 된 파일에 대한 모든 변경 내용 <sha1 rev>
은 무시됩니다." 그러나이 시점에서 복제 이후 아무런 변화가 없었으므로 목적은 무엇입니까? 에서 현재 분기를 자르 <sha1 rev>
나요?
TL; DR-복제하려는 커밋에 대해 소스 저장소에 태그를 작성하고 fetch 명령에서 태그를 사용하십시오. 나중에 원본 리포지토리에서 태그를 삭제하여 정리할 수 있습니다.
글쎄, 그것의 2014 년과 2010 년에 Charles Bailey가 받아 들인 대답은 지금까지는 완전히 구식이며 다른 답변의 대부분 (모두?)은 많은 사람들이 피하고 싶어하는 복제와 관련이 있습니다.
다음 솔루션은 OP 및 다른 많은 사람들이 찾고있는 것을 달성합니다. 이는 히스토리를 포함하여 저장소의 사본을 작성하지만 특정 커밋까지만 작성하는 방법입니다.
다음은 git 버전 2.1.2와 함께 로컬 저장소 (예 : 다른 디렉토리의 저장소)를 특정 지점까지 복제하는 데 사용한 명령입니다.
# in the source repository, create a tag against the commit you want to check out
git tag -m "Temporary tag" tmptag <sha1>
# create a new directory and change into that directory
cd somewhere_else;mkdir newdir;cd newdir
# ...and create a new repository
git init
# add the source repository as a remote (this can be a URL or a directory)
git remote add origin /path/to/original/repo
# fetch the tag, which will include the entire repo and history up to that point
git fetch origin refs/tags/tmptag
# reset the head of the repository
git reset --hard FETCH_HEAD
# you can now change back to the original repository and remove the temporary tag
cd original_repo
git tag -d tmptag
이 솔루션이 몇 년 동안 계속 작동하기를 바랍니다. :-)
간단하게 사용할 수 있습니다 git checkout <commit hash>
이 순서로
bash
git clone [URLTORepository]
git checkout [commithash]
커밋 해시는이 "45ef55ac20ce2389c9180658fdba35f4a663d204"와 같습니다.
위의 답변 중 2 개 사용 ( 특정 개정 / 변경 세트로 git 저장소를 복제하는 방법 및 특정 개정 / 변경 세트로 git 저장소를 복제하는 방법? )를 사용하여 결정을 내릴 수있었습니다. 포인트까지 복제하려면 해당 포인트는 단순히 SHA가 아닌 태그 / 분기 여야합니다. 그렇지 않으면 FETCH_HEAD가 혼동됩니다. git fetch set 다음에 분기 또는 태그 이름을 사용하면 응답을 얻습니다. 단순히 SHA-1을 사용하면 응답하지 않습니다.
여기 내가 한 일이 있습니다 :-실제 원점에서 전체 저장소의 전체 작업 복제본을 만듭니다.
cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git
그런 다음 흥미로운 지점에서 로컬 지점을 만듭니다.
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point
그런 다음 로컬 사본을 원본으로 사용하여 새 빈 저장소를 만듭니다.
cd <path to create repo>
mkdir reduced-repo
cd reduced-repo
git init
git remote add local_copy <path to create repo>/ui
git fetch local_copy origin_point
그 시점에서 나는이 응답을 얻었다. 위의 분기 대신 SHA-1을 사용하면 아무 일도 일어나지 않으므로 응답이 작동한다는 것을 알기 때문에
/ var / www / html / ui-hacking $ 자식 패치 local_copy origin_point 원격 : 개체 수 : 45493, 완료. 원격 : 객체 압축 : 100 % (15928/15928) 완료 원격 : 총 45493 (델타 27508), 재사용 45387 (델타 27463) 받는 물건 : 100 % (45493/45493), 53.64 MiB | 50.59 MiB / s 완료 델타 해결 : 100 % (27508/27508) 완료 / var / www / html / ui에서 * 분기 origin_point-> FETCH_HEAD * [새 지점] origin_point-> origin / origin_point
이제 내 경우에는 신선한 리포지토리로 gitlab에 다시 넣어야했습니다.
git remote add origin git@<our gitlab server>:ui-developers/new-ui.git
즉, git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k
원격 체리 선택 을 사용하여 origin_point에서 내 repo를 다시 빌드 git push origin
하고 전체 로트를 새 집으로 다시 업로드하는 데 사용할 수 있습니다.
누군가를 돕는 희망
git fetch local_copy origin_point
JamesGs 와 어떻게 다릅니 까 git fetch origin refs/tags/tmptag
?
git fetch local_copy origin_point
빈과 상태에 당신을 떠날 reduced-repo
단지를 포함, 디렉토리 .git
. 이 지침에 빠진 것이 있습니다 ...
내 버전은 인정되고 가장 많이 찬성 된 답변의 조합이었습니다. 그러나 모두가 SHA1을 사용하지만 아무도 그것을 얻는 방법을 알려주지 않기 때문에 조금 다릅니다.
$ git init
$ git remote add <remote_url>
$ git fetch --all
이제 모든 분기 및 커밋을 볼 수 있습니다
$ git branch -a
$ git log remotes/origin/master <-- or any other branch
마지막으로 원하는 커밋의 SHA1을 알고 있습니다.
git reset --hard <sha1>
나는이 코드를 GNU make와 함께 사용하여 개정 태그, 분기 또는 해시를 닫습니다.
git 버전 2.17.1에서 테스트되었습니다.
${dir}:
mkdir -p ${@D}
git clone --recursive --depth 1 --branch ${revison} ${url} ${@} \
|| git clone --recursive --branch ${revison} ${url} ${@} \
|| git clone ${url} ${@}
cd ${@} && git reset --hard ${revison}
ls $@
git clone https://github.com/ORGANIZATION/repository.git
(저장소 복제)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
# clone special tag/branch without history
git clone --branch=<tag/branch> --depth=1 <repository>
# clone special revision with minimal histories
git clone --branch <branch> <repository> --shallow-since=yyyy-MM-ddTHH:mm:ss # get the commit time
cd <dir>
git reset --hard <revision>
uploadpack.allowReachableSHA1InWant=true
서버 측에서 설정하지 않으면 기록이없는 개정을 얻을 수 없지만 대신 태그를 작성하고 특수 태그를 복제 할 수 있습니다.
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
git
origin
널리 알려진 단어 대신 단어 를 사용합니다revision
다음은 매뉴얼의 스 니펫입니다. $ git help clone
--origin <name>, -o <name>
Instead of using the remote name origin to keep track of the upstream repository, use <name>.
--depth=1
답변에 언급되어 있지 않으므로 여기에 언급되지 않은 것을 더 추가하면 왜이 답변이 효과가 있다고 말할까요? 문제가 해결되어 기쁘지만이 답변은 오해의 소지가 있으며 부분적으로는 질문에 답변하지 않습니다. 따라서 downvotes.
git clone <url> <local_dir_name>
단지 자신을 위해보십시오. 유일한 차이점은 원격 (을 사용하여 git remote
표시됨)이 관례적인 "origin"이라는 이름 대신 일부 암호화 된 sha1 시퀀스라고합니다. 즉, <sha1-of-the-commit>
이 답변에서 언급이없는 더 있는 개정 분기 체크 아웃 할 서버 또는 어떤에서 페치 무엇이든지 베어링.
git clone -o 896066ee1cf4d653057dac4e952f49c96ad16fa7 https://github.com/torvalds/linux.git linux --depth=1
. 이것은 나에게 수정을 제공 8a28d674
하고 있지 896066ee
당신이 대답 주장으로.
git clone -b 10.1 https://github.com/MariaDB/server.git --depth=1 mariadb-server-src