Programing

특정 개정 / 변경 세트로 git 저장소를 복제하는 방법은 무엇입니까?

lottogame 2020. 2. 29. 13:34
반응형

특정 개정 / 변경 세트로 git 저장소를 복제하는 방법은 무엇입니까?


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 clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

가장 최근의 커밋으로 다시 돌아가려면

$ git pull

git 리포지토리를 복제하면 전체 리포지토리가 복제됩니다. 복제 할 리비전을 하나만 선택할 수있는 방법은 없습니다. 그러나 일단 수행 한 후에는을 수행 git clone하여 특정 개정을 체크 아웃 할 수 있습니다 checkout <rev>.


처음부터 특정 지점까지 모든 것을 가져오고 싶다면 Charles Bailey의 대답이 완벽합니다. 역순으로하고 현재 날짜부터 되돌아온 기록의 하위 집합을 검색하려는 경우 git clone --depth [N]N은 원하는 기록의 수입니다. 하나:

--깊이

지정된 수의 개정판으로 기록이 잘린 얕은 복제본을 만듭니다. 얕은 저장소에는 여러 가지 제한이 있지만 (복제하거나 가져올 수 없으며, 밀어 넣거나 넣을 수는 없습니다), 오랜 역사를 가진 대규모 프로젝트의 최근 기록에만 관심이 있고 적절한 경우 수정 사항을 패치로 보내십시오.


요약하면 (git v. 1.7.2.1) :

  1. git clone당신이 repo를 원하는 곳 에서 규칙적으로 행동하십시오 (모든 것을 최신 상태로 유지하십시오 – 나는 원하는 것을 알지 못합니다, 우리는 거기에 가고 있습니다)
  2. git checkout <sha1 rev> 당신이 원하는 rev의
  3. git reset --hard
  4. git checkout -b master

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 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).


간단하게 사용할 수 있습니다 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하고 전체 로트를 새 집으로 다시 업로드하는 데 사용할 수 있습니다.

누군가를 돕는 희망


내 버전은 인정되고 가장 많이 찬성 된 답변의 조합이었습니다. 그러나 모두가 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>

git clone https://github.com/ORGANIZATION/repository.git (저장소 복제)

cd repository (navigate to the repository)

git fetch origin 2600f4f928773d79164964137d514b85400b09b2

git checkout FETCH_HEAD


나는이 코드를 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 repo
$ git checkout -b newbranch
$ git branch --set-upstream-to=origin/branch newbranch
$ git pull

그게 다야


git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>

gitorigin널리 알려진 대신 단어 사용revision

다음은 매뉴얼의 스 니펫입니다. $ git help clone

--origin <name>, -o <name>
    Instead of using the remote name origin to keep track of the upstream repository, use <name>.

참고 URL : https://stackoverflow.com/questions/3489173/how-to-clone-git-repository-with-specific-revision-changeset



반응형