programing

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

i4 2023. 5. 26. 20:44
반응형

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

내가 보통 Mercurial에서 하는 것과 같은 특정 리비전을 사용하여 git 저장소를 복제하려면 어떻게 해야 합니까?

hg clone -r 3 /path/to/repository
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

가장 최근의 커밋으로 다시 돌아가십시오.

$ git pull

되돌린 커밋을 온라인(원격)으로 저장하려면 시행 오리진을 푸시해야 합니다.

git push origin -f

업데이트 2 Git 2.5.0은 구성 변수가 있는 서버 측에서 아래에 설명된 기능을 활성화할 수 있으므로 여기서 GitHub 기능 요청 및 GitHub 커밋을 활성화합니다.일부 Git 서버는 기본적으로 이 옵션을 활성화합니다. 예를 들어, Bitbucket Server는 버전 5.5+부터 이 옵션을 활성화했습니다.구성 옵션을 활성화하는 방법에 대한 예는 스택 교환에서 이 답변을 참조하십시오.

업데이트 1 Git 버전의 경우1.7 < v < 2.5Vaibhav Bajpai의 답변에 설명된 대로 git clone 및 git reset 사용

전체 리포지토리를 가져오지 않으려면 사용하지 않는 것이 좋습니다.clone항상 fetch를 사용하여 가져올 분기를 선택할 수 있습니다.은 모릅니다.-r하지만 이런 것을 할 수 있습니다.

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

Agit 저장소를 복제하면 전체 저장소가 복제됩니다. 복제할 리비전을 하나만 선택할 수는 없습니다.그나일수면하를 하면,git clone다음을 수행하여 특정 개정판을 확인할 수 있습니다.checkout <rev>.

간단하게 사용할 수 있습니다.git checkout <commit hash>

이 순서로

bash git clone [URLTORepository] git checkout [commithash]

커밋 해시는 "45ef55ac20ce2389c9180658(ba35f4a663d)"처럼 보입니다.

처음부터 특정 지점까지 모든 것을 가져오고 싶다는 뜻이라면 찰스 베일리의 대답은 완벽합니다. 올라가는 집합을 반로현날서이기전하록집의위검합다다있수사면니습음을용할려색하대을재짜에를 하면 됩니다.git clone --depth [N]여기서 N은 원하는 역사의 회전수입니다.그러나:

--깊이

기록이 지정된 리비전 수만큼 잘린 얕은 복제본을 만듭니다.얕은 저장소에는 여러 가지 제한이 있지만(복제하거나 가져올 수 없으며, 저장소에서 밀어넣거나 밀어넣을 수도 없음), 오래된 대형 프로젝트의 최근 기록에만 관심이 있고 패치로 수정 사항을 보내려는 경우에는 적합합니다.

요약하자면 (git v. 1.7.2.1):

  1. 규칙적으로 하다, 규칙적으로git clone레포를 원하는 곳(모든 것을 최신 상태로 유지합니다. 알고 있습니다. 원하는 것이 아닙니다. 우리는 거기에 도달하고 있습니다.)
  2. git checkout <sha1 rev>의.
  3. git reset --hard
  4. git checkout -b master

TL;DR - 복제할 커밋에 대해 소스 저장소에 태그를 생성하고 fetch 명령에 태그를 사용합니다.나중에 원래 보고서에서 태그를 삭제하여 정리할 수 있습니다.

글쎄요, 2014년이고 2010년에 찰스 베일리가 인정한 대답은 지금까지 잘 그리고 정말로 구식인 것처럼 보이고 다른 대부분의 대답은 많은 사람들이 피하기를 바라는 복제와 관련이 있습니다.

다음 솔루션은 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 init:

git clone --depth=1 URL
git fetch --depth=1 origin SHA1
git checkout SHA1
git branch -D @{-1}  # if you want to tidy up the fetched branch

이것은 CB Bailys의 답변에 대해 당신이 여전히 1개의 불필요한 개정판을 다운로드할 것이라는 단점을 가지고 있습니다.하지만 엄밀히 말하면 그것은git clone(OP가 원하는 것), 그리고 그것은 당신이 어떤 지점의 전체 기록을 다운로드하도록 강요하지 않습니다.

# 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 --config 옵션을 사용하여 이를 달성할 수 있었습니다. 이 옵션은 다음 답변을 통해 배웠습니다. https://stackoverflow.com/a/43759576/1330650

제 시나리오는 Azure DevOps 파이프라인에서 드문 체크아웃을 포함하며, 여기서 지점 이름이 아닌 커밋 해시를 사용하여 리포를 복제해야 합니다.복제 명령에서 커밋 해시를 매개 변수로 사용할 수 없습니다.해결 방법은 refspec이 분기 이름 대신 커밋 해시를 사용할 수 있기 때문에 refspec을 포함하는 구성 변수(-c)를 설정하는 것입니다.

git clone -c remote.origin.fetch=+<commit hash>:refs/remotes/origin/<commit hash> <repo_url> --no-checkout --progress --depth 1
git sparse-checkout init --cone
git sparse-checkout set <file list>
git checkout <commit hash>

단일 분기를 복제하고 커밋을 선택한 다음 특정 커밋을 체크아웃하기 위한 전체 워크플로우...0합니다. Git 버전 2.28.0 이 필요합니다.--no-write-fetch-head 2했습니다. 한 sha1 를 이미 , 블록에서수 있는 두 .) § 2.353으로 테스트했습니다. (만약 당신이 당신이 원하는 커밋의 완전한 sha1 해시를 이미 알고 있다면, 최종 코드 블록에서 사용할 수 있는 두 번째 방법으로 건너뜁니다.)

#Create empty git repo
mkdir repo && cd repo && git init

#add remote, configure it to track <branch>
git remote add --no-tags -t <branch> -m <branch> origin <url>

#fetch objects from remote repo
git fetch --no-write-fetch-head

#examine commits and logs to decide which one we will use
git log --oneline origin

#Once you have found the commit of interest copy the abbreviated hash or save as variable
commit=<sha1>

#rename our default branch to match remote branch
git branch -m <branch>

#set branch head to desired commit
git branch <branch> $commit

#set remote branch as upstream for <branch>
git branch -u origin <branch>

#All done time to checkout
git checkout

선택적으로 로컬 분기의 기록을 잘라내려면 다음을 실행합니다.

git fetch --no-write-fetch-head --depth <n> ./ <branch>

원격 분기 기록을 잘라내려면 다음을 실행할 수 있지만 체크아웃한 커밋보다 최신 커밋으로 기록을 잘라내는 경우git status당신이 원격에서 이탈했다고 말할 것입니다.<n> 행위

git fetch --no-write-fetch-head --depth <n>

원격 추적이 필요하지 않고 전체 커밋 해시를 이미 알고 있는 경우:

mkdir repo && cd repo && git init
git remote add --no-tags origin <url>
git fetch --depth 1 --no-write-fetch-head origin <sha1>
#Set default local branch (master in this case) head to <sha1>
git branch master <sha1>
git checkout

제 생각에 이 방법이 더 나은 것은 정말로 단 한 번의 약속만 가져온다는 것입니다.또한 FETCH_HEAD 또는 ORIG_HEAD를 생성하여 .git 디렉터리를 깨끗하게 유지하는 것을 방지합니다.로 (으로) 됩니다. 이는 다음과 같은 이유로 인해 두 개의 항목이 있는 것과 반대됩니다.git reset --hard commitfetch --depth 1가능한 최소 클론(클론 복제)을 생성합니다.

위의 답변 중 2개를 사용합니다(특정 리비전/변경 세트로 git 저장소를 복제하는 방법).특정 리비전/변경 세트로 git 저장소를 복제하는 방법은 무엇입니까?)결정적인 방법을 생각해내는 데 도움이 되었습니다.포인트까지 복제하려면 해당 포인트가 단순히 SHA가 아니라 태그/분기여야 합니다. 그렇지 않으면 FETCH_HEAD가 혼동됩니다.git fetch 집합에 이어 분기 또는 태그 이름을 사용하면 응답이 표시되고, 단순히 SHA-1을 사용하면 응답이 표시되지 않습니다.
가 한 과 같습니다. - 출처에서 . - 은일음다o▁here▁-만다▁of듭니▁ao을▁rep의▁full본제▁did▁clone-▁the▁create제:,▁i▁working▁the▁from가▁full▁what's.

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/www/ui-filename$ gitfetch local_copy origin_pointremote: counting objects. 45493, 완료.
원격: 물체 압축: 100%(15928/15928), 완료.
원격: 총 45493(델타 27508), 재사용 45387(델타 27463)수신 객체: 100% (45493/45493), 53.64 MiB | 50.59 MiB, 완료.
델타 해결: 100%(27508/27508), 완료.
원본 /var/www/html/uibranch origin_point -> FETCH_HEAD[신규지점] origin_point -> origin/continue_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 격으로체선다사음용다니합택한을리원픽다▁to니▁cherry를 사용합니다.git push origin새 집으로 모든 것을 업로드하는 것.

누군가를 돕는 희망

제 버전은 승인된 답변과 가장 많은 지지를 받은 답변의 조합이었습니다.하지만 조금 다릅니다. 모두가 SHA1을 사용하지만 아무도 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>
mkdir linux-4.3.20151106
cd linux-4.3.20151106/
git init
git fetch git@github.com:torvalds/linux.git 9154301a47b33bdc273d8254c407792524367558

error: unknown option `no-write-fetch-head'        
usage: git fetch [<options>] [<repository> [<refspec>...]]   or: git fetch [<options>] <group>                                      
   or: git fetch --multiple [<options>] [(<repository> | <group>)...]   or: git fetch --all [<options>]       



 git --version
git version 2.17.1

export https_proxy=http://192.168.1.3:1080;export http_proxy=http://192.168.1.3:1080
add-apt-repository ppa:git-core/ppa
apt update
apt-get install --only-upgrade git

 git --version
git version 2.38.0


 git fetch git@github.com:torvalds/linux.git 9154301a47b33bdc273d8254c407792524367558 --no-write-fetch-head --depth=1 
remote: Enumerating objects: 54692, done.
remote: Counting objects: 100% (54692/54692), done.
remote: Compressing objects: 100% (50960/50960), done.
remote: Total 54692 (delta 3828), reused 29210 (delta 2966), pack-reused 0
Receiving objects: 100% (54692/54692), 147.35 MiB | 2.85 MiB/s, done.
Resolving deltas: 100% (3828/3828), done.
 


git branch master 9154301a47b33bdc273d8254c407792524367558


git checkout
 

나는 이 스니펫을 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

단일 파일의 경우 커밋 번호가 알려진 경우 wget onlineer를 사용할 수 있습니다.

wget https://raw.githubusercontent.com/torvalds/linux/896066ee1cf4d653057dac4e952f49c96ad16fa7/README
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>.

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

반응형