Bagaimana saya bisa mengkloning repositori git dengan revisi tertentu, sesuatu yang biasanya saya lakukan di Mercurial:
hg clone -r 3 /path/to/repository
Bagaimana saya bisa mengkloning repositori git dengan revisi tertentu, sesuatu yang biasanya saya lakukan di Mercurial:
hg clone -r 3 /path/to/repository
Jawaban:
PEMBARUAN 2 Karena Git 2.5.0 fitur yang dijelaskan di bawah ini dapat diaktifkan di sisi server dengan variabel konfigurasi uploadpack.allowReachableSHA1InWant
, di sini permintaan fitur GitHub dan komit GitHub mengaktifkan fitur ini . Perhatikan bahwa beberapa server Git mengaktifkan opsi ini secara default, mis. Bitbucket Server mengaktifkannya sejak versi 5.5+ . Lihat jawaban ini di Stackexchange untuk contoh cara mengaktifkan opsi konfigurasi.
UPDATE 1 Untuk versi Git 1.7 < v < 2.5
gunakan git clone dan git reset, seperti yang dijelaskan dalam jawaban Vaibhav Bajpai
Jika Anda tidak ingin mengambil repositori penuh maka Anda mungkin tidak boleh menggunakan clone
. Anda selalu dapat menggunakan fetch untuk memilih cabang yang ingin Anda ambil. Saya bukan ahli hg jadi saya tidak tahu detailnya -r
tetapi di git Anda bisa melakukan sesuatu seperti ini.
# 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>
berhasil; sepertinya Anda perlu memberikan referensi nama seperti tag atau nama cabang. Lihat kerneltrap.org/mailarchive/git/2009/1/13/4707444
git fetch origin <SHA1>
untuk beralih ke revisi apa pun yang saya inginkan setelah saya mengambil master dari remote dan melakukan yang reset --hard
sebenarnya instantiate cabang secara lokal. Saya tidak dapat mengambil revisi secara langsung. Dengan git 1.7, git fetch origin <SHA1>
tidak berfungsi, seperti dilansir @artur; Anda perlu menggunakan git checkout <SHA1>
diikuti oleh a reset --hard
.
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
Untuk kembali ke komit terbaru
$ git pull
--depth
yang sangat penting untuk repo besar. Solusi ini membutuhkan menarik semua objek, dan mengatur ulang ke revisi sebelumnya. Ini sangat memakan waktu dan boros bandwidth jaringan.
Mengkloning repositori git, dengan tepat, mengkloning seluruh repositori: tidak ada cara untuk memilih hanya satu revisi untuk dikloning. Namun, begitu Anda melakukan git clone
, Anda dapat checkout revisi tertentu dengan melakukan checkout <rev>
.
git clone
meraih seluruh repositori. Setelah memilikinya, Anda dapat checkout revisi tertentu.
git clone --single-branch ...
Untuk mengkloning hanya satu komit tunggal pada cabang atau penggunaan tag tertentu:
git clone --depth=1 --branch NAME https://github.com/your/repo.git
Sayangnya, NAME
hanya bisa berupa nama cabang atau nama tag (bukan komit SHA).
Hilangkan --depth
bendera untuk mengunduh seluruh riwayat dan kemudian memeriksa cabang atau tag itu:
git clone --branch NAME https://github.com/your/repo.git
Ini bekerja dengan git versi terbaru (saya melakukannya dengan versi 2.18.0
).
Jika Anda ingin mengambil semuanya dari awal hingga titik tertentu, jawaban Charles Bailey sempurna. Jika Anda ingin melakukan kebalikan dan mengambil bagian dari riwayat yang kembali dari tanggal saat ini, Anda dapat menggunakan di git clone --depth [N]
mana N adalah jumlah putaran sejarah yang Anda inginkan. Namun:
--kedalaman
Buat klon dangkal dengan riwayat terpotong ke jumlah revisi yang ditentukan. Repositori dangkal memiliki sejumlah keterbatasan (Anda tidak dapat mengkloning atau mengambil darinya, atau mendorong dari atau ke dalamnya), tetapi cukup jika Anda hanya tertarik pada sejarah baru-baru ini dari proyek besar dengan sejarah yang panjang, dan ingin kirim perbaikan sebagai tambalan.
Singkatnya (git v. 1.7.2.1):
git clone
mana Anda ingin repo (mendapatkan segalanya untuk tanggal - saya tahu, bukan apa yang diinginkan, kami sampai di sana) git checkout <sha1 rev>
dari rev yang Anda inginkangit reset --hard
git checkout -b master
master
dan beralih ke sana.
git reset --hard
? Dokumen untuk itu mengatakan "Mereset ulang indeks dan pohon kerja. Setiap perubahan pada file yang dilacak di pohon kerja sejak <commit> [yang default ke HEAD, yang sekarang <sha1 rev>
] dibuang." Tetapi pada saat ini kami belum melakukan perubahan sejak kloning, jadi apa tujuannya? Apakah itu memotong cabang saat ini di <sha1 rev>
?
TL; DR - Cukup buat tag di repositori sumber melawan komit yang ingin Anda tiru dan gunakan tag dalam perintah ambil. Anda dapat menghapus tag dari repo asli nanti untuk membersihkan.
Nah, ini 2014 dan sepertinya jawaban Charles Bailey yang diterima dari 2010 sudah baik dan benar-benar ketinggalan jaman sekarang dan sebagian besar (semua?) Jawaban lain melibatkan kloning, yang banyak orang berharap untuk menghindarinya.
Solusi berikut ini mencapai apa yang dicari OP dan banyak lainnya, yang merupakan cara untuk membuat salinan repositori, termasuk sejarah, tetapi hanya sampai komit tertentu.
Berikut adalah perintah yang saya gunakan dengan git versi 2.1.2 untuk mengkloning repo lokal (mis. Repositori di direktori lain) hingga titik tertentu:
# 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
Semoga solusi ini terus bekerja selama beberapa tahun lagi! :-)
Anda dapat menggunakannya secara sederhana git checkout <commit hash>
dalam urutan ini
bash
git clone [URLTORepository]
git checkout [commithash]
komit hash terlihat seperti ini "45ef55ac20ce2389c9180658fdba35f4a663d204"
Menggunakan 2 jawaban di atas ( Bagaimana mengkloning repositori git dengan revisi / perubahan tertentu? Dan Bagaimana mengkloning repositori git dengan revisi / perubahan tertentu? ) Membantu saya membuat definisi. Jika Anda ingin mengkloning suatu titik, maka titik itu harus berupa tag / cabang bukan hanya SHA atau FETCH_HEAD jadi bingung. Mengikuti set git fetch, jika Anda menggunakan nama cabang atau tag, Anda mendapatkan respons, jika Anda hanya menggunakan SHA-1, Anda tidak mendapatkan respons.
Inilah yang saya lakukan: - membuat klon kerja penuh dari repo penuh, dari asal sebenarnya
cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git
Kemudian buat cabang lokal, pada titik yang menarik
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point
Kemudian buat repo kosong baru saya, dengan salinan lokal saya sebagai asalnya
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
Pada saat itu saya mendapat tanggapan ini. Saya perhatikan karena jika Anda menggunakan SHA-1 sebagai pengganti cabang di atas, tidak ada yang terjadi, jadi responsnya, berarti berhasil
/ var / www / html / ui-hacking $ git untuk mengambil local_copy origin_point jarak jauh: Menghitung objek: 45493, selesai. jarak jauh: Mengompresi objek: 100% (15928/15928), selesai. jarak jauh: Total 45493 (delta 27508), digunakan kembali 45387 (delta 27463) Menerima objek: 100% (45493/45493), 53,64 MiB | 50,59 MiB / s, selesai. Menyelesaikan delta: 100% (27508/27508), selesai. Dari / var / www / html / ui * branch origin_point -> FETCH_HEAD * [cabang baru] origin_point -> origin / origin_point
Sekarang dalam kasus saya, saya kemudian perlu mengembalikannya ke gitlab, sebagai repo baru jadi saya lakukan
git remote add origin git@<our gitlab server>:ui-developers/new-ui.git
Yang berarti saya bisa membangun kembali repo saya dari origin_point dengan menggunakan git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k
untuk memilih cherry dari jarak jauh kemudian menggunakan git push origin
untuk mengunggah seluruh lot kembali ke rumah barunya.
Semoga itu bisa membantu seseorang
git fetch local_copy origin_point
perbedaan Anda dari JamesGs git fetch origin refs/tags/tmptag
?
git fetch local_copy origin_point
meninggalkan Anda dalam keadaan dengan kosong reduced-repo
direktori, hanya berisi .git
. Ada sesuatu yang hilang dari instruksi ini ...
Versi saya adalah kombinasi dari jawaban yang diterima dan paling banyak dipilih. Tapi ini sedikit berbeda, karena semua orang menggunakan SHA1 tetapi tidak ada yang memberitahu Anda cara mendapatkannya
$ git init
$ git remote add <remote_url>
$ git fetch --all
sekarang Anda dapat melihat semua cabang & melakukan
$ git branch -a
$ git log remotes/origin/master <-- or any other branch
Akhirnya Anda tahu SHA1 dari komit yang diinginkan
git reset --hard <sha1>
Saya menggunakan cuplikan ini dengan GNU make untuk menutup tag revisi, cabang, atau hash
itu diuji pada git versi 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
(mengklon repositori)
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>
Anda tidak bisa mendapatkan revisi tanpa riwayat jika tidak diatur uploadpack.allowReachableSHA1InWant=true
di sisi server, sementara Anda dapat membuat tag untuk itu dan mengkloning tag khusus sebagai gantinya.
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
git
menggunakan kata ini origin
sebagai ganti dari yang terkenalrevision
Berikut ini adalah cuplikan dari manual $ 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
tidak disebutkan dalam jawaban, jadi mengapa Anda mengatakan jawaban ini berhasil jika Anda menambahkan lebih banyak hal yang tidak disebutkan di sini? Saya senang itu berhasil untuk Anda, tetapi jawaban ini menyesatkan dan sebagian tidak menjawab pertanyaan. Karena itu downvotes.
git clone <url> <local_dir_name>
, coba saja sendiri. Satu-satunya perbedaan adalah bahwa remote (ditampilkan menggunakan git remote
) akan disebut beberapa urutan shta cryptic bukannya nama "asal" yang biasa. Dengan kata lain, yang <sha1-of-the-commit>
disebutkan dalam jawaban ini tidak ada kaitannya dengan revisi mana yang diambil dari server atau cabang mana yang akan diperiksa.
git clone -o 896066ee1cf4d653057dac4e952f49c96ad16fa7 https://github.com/torvalds/linux.git linux --depth=1
. Ini memberi saya revisi 8a28d674
dan bukan 896066ee
seperti yang Anda dan jawaban ini klaim.
git clone -b 10.1 https://github.com/MariaDB/server.git --depth=1 mariadb-server-src