如何克隆具備特定修訂/變動集的git存儲庫?

如何克隆具備特定修訂版的git存儲庫,就像我一般在Mercurial中所作的那樣: html

hg clone -r 3 /path/to/repository

#1樓

$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

再次回到最近的提交 git

$ git pull

#2樓

您能夠簡單地使用git checkout <commit hash> bash

按此順序 gitlab

bash git clone [URLTORepository] git checkout [commithash] fetch

提交哈希看起來像這樣「 45ef55ac20ce2389c9180658fdba35f4a663d204」 ui


#3樓

TL; DR-只需針對要克隆的提交在源存儲庫中建立一個標籤,而後在fetch命令中使用該標籤。 您能夠稍後從原始存儲庫中刪除標籤以進行清理。 this

好吧,它的2014年,以及查爾斯·貝利(Charles Bailey)從2010年開始接受的答案,如今看來已經徹底過期了,其餘大多數(全部?)答案都涉及克隆,這是許多人但願避免的。 url

如下解決方案實現了OP及其它許多人正在尋找的解決方案,這是一種建立存儲庫副本的方法,包括歷史記錄,但僅限於必定的提交。 spa

如下是我在git版本2.1.2中使用的命令,用於將本地存儲庫(即另外一個目錄中的存儲庫)克隆到特定點: 3d

# 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

但願該解決方案能夠繼續工做幾年! :-)


#4樓

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

#5樓

使用上述答案中的2個( 如何使用特定的修訂/更改集 克隆git存儲庫 以及如何使用特定的修訂/更改集克隆git存儲庫? )幫助我提出了一個明確的定義。 若是要克隆到某個點,則該點必須是標記/分支,而不單單是SHA或FETCH_HEAD會混淆。 遵循git fetch設置後,若是您使用分支或標記名稱,則將獲得響應,若是僅使用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$ git fetch local_copy origin_point
remote: Counting objects: 45493, done.
remote: Compressing objects: 100% (15928/15928), done.
remote: Total 45493 (delta 27508), reused 45387 (delta 27463)
Receiving objects: 100% (45493/45493), 53.64 MiB | 50.59 MiB/s, done.
Resolving deltas: 100% (27508/27508), done.
From /var/www/html/ui
 * branch            origin_point -> FETCH_HEAD
 * [new branch]      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重建個人倉庫git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k遠程選擇櫻桃,而後使用git push origin將整個批次上傳回其新家。

但願能夠幫助某人

相關文章
相關標籤/搜索