Bagaimana cara menarik satu file dari repositori server di Git?

114

Saya bekerja di situs dengan server yang menjalankan Git. Saya menggunakan Git untuk penerapan (bukan GitHub). Ini diatur sebelum keterlibatan saya menggunakan metode hook , dan saya merujuk ke pertanyaan ini dan memasukkan perintah di bawah ini, tetapi tidak berhasil.

Bagaimana cara menarik satu file dari server? Misalnya, jika saya ingin memperbarui file lokal saya index.php? git pull index.php?

vsvs
sumber
1
Kemungkinan duplikat dari Apakah mungkin menarik hanya satu file di Git?
Mateusz Piotrowski
Kemungkinan duplikat Bagaimana cara checkout hanya satu file dari git repository?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

194

Hal ini dimungkinkan untuk dilakukan (dalam repositori yang diterapkan):

git fetch
// git fetch will download all the recent changes, but it will not put it in your current checked out code (working area).

Diikuti oleh:

git checkout origin/master -- path/to/file
// git checkout <local repo name (default is origin)>/<branch name> -- path/to/file will checkout the particular file from the downloaded changes (origin/master).
chrismillah
sumber
1
Terima kasih. Jadi apa yang kamu maksud dengan <revision>? nama file? Dan jika file saya ada di direktori root, apakah itu berarti saya harus mengetik git checkout -m index.php index.php:?
vsvs
Terima kasih atas penjelasannya.
vsvs
Apakah itu cepat *origin*/masteratau bisa dari jarak jauh? Apakah seluruh riwayat ditarik ke dalam repo saya atau apakah file tersebut tampak secara ajaib?
Bernhard Döbler
Jika Anda mendapatkan kesalahan ini "tidak cocok dengan file apa pun yang dikenal dengan git": "path / to / file" seharusnya bukan salinan jalur yang Anda dapatkan dari lokasi file di GitHub, yang berarti "repoName / fileName" , Anda harus membuang "repoName /" dan ini akan berfungsi.
Eduard
1
@ BernhardDöbler dapat cabang mana saja dari jarak jauh :)
chrismillah
27
git fetch --all
git checkout origin/master -- <your_file_path>
git add <your_file_path>
git commit -m "<your_file_name> updated"

Ini dengan asumsi Anda menarik file dari origin / master.

OYORF
sumber
13

Ini bisa jadi solusinya:

git fetch

git checkout origin/master -- FolderPathName/fileName

Terima kasih.

Y. Joy Ch. Singha
sumber
5

Skenario ini muncul ketika Anda - atau kekuatan yang lebih besar dari Anda - telah mengacaukan file di repo lokal Anda dan Anda hanya ingin memulihkan salinan baru versi terbaru dari repo. Cukup menghapus file dengan / bin / rm (bukan git rm) atau mengganti nama / menyembunyikannya dan kemudian mengeluarkan git pullwasiat tidak berfungsi: git memperhatikan ketidakhadiran file dan menganggap Anda mungkin ingin file itu hilang dari repo ( git diffakan menampilkan semua baris yang dihapus dari file hilang).

git pulltidak memulihkan file yang hilang secara lokal selalu membuat saya frustrasi tentang git, mungkin karena saya telah dipengaruhi oleh sistem kontrol versi lain (misalnya pembaruan svn yang saya yakin akan memulihkan file yang telah disembunyikan secara lokal).

git reset --hard HEADadalah cara alternatif untuk memulihkan file yang diinginkan karena membuang semua perubahan yang tidak mengikat yang Anda miliki. Namun, seperti yang disebutkan di sini , git reset is adalah perintah yang berpotensi berbahaya jika Anda memiliki perubahan tidak terikat lainnya yang Anda pedulikan.

The git fetch ... git checkoutStrategi disebutkan di atas oleh @chrismillah adalah cara bedah yang bagus untuk mengembalikan file yang bersangkutan.

Trutane
sumber
1
jauh lebih esplicatif daripada komentar orang lain. Terima kasih
Thecave3
3

Saya mencari tugas yang sedikit berbeda, tetapi ini terlihat seperti yang Anda inginkan:

git archive --remote=$REPO_URL HEAD:$DIR_NAME -- $FILE_NAME |
tar xO > /where/you/want/to/have.it

Maksud saya, jika Anda ingin mengambil path/to/file.xz, Anda akan menyetel DIR_NAMEke path/todan FILE_NAMEke file.xz. Jadi, Anda akan mendapatkan sesuatu seperti

git archive --remote=$REPO_URL HEAD:path/to -- file.xz |
tar xO > /where/you/want/to/have.it

Dan tidak ada yang menghalangi Anda dari bentuk pembongkaran lain selain tar xOtentu saja (Akulah yang membutuhkan pipa di sini, ya).

jno
sumber
1

Coba gunakan:

git checkout branchName -- fileName

Ex:

git checkout master -- index.php
Dodda Venkata
sumber
2
Perhatian: "git checkout master - index.php" ini tidak melakukan checkout dari server, tetapi dari database git lokal dari penarikan terakhir.
Roberto Novakosky
0

Batch windows ini berfungsi terlepas dari apakah itu ada di GitHub atau tidak. Saya menggunakannya karena ini menunjukkan beberapa peringatan yang jelas. Anda akan melihat bahwa operasinya lambat dan melintasi ratusan megabyte data , jadi jangan gunakan metode ini jika persyaratan Anda didasarkan pada memori bandwidth / RW yang tersedia.

sparse_checkout.bat

pushd "%~dp0"
if not exist .\ms-server-essentials-docs mkdir .\ms-server-essentials-docs
pushd .\ms-server-essentials-docs
git init
git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git
git config core.sparseCheckout true
(echo EssentialsDocs)>>.git\info\sparse-checkout
git pull origin master

=>

C: \ Users \ nama pengguna \ Desktop> sparse_checkout.bat

C: \ Users \ nama pengguna \ Desktop> pushd "C: \ Users \ nama pengguna \ Desktop \"

C: \ Users \ nama pengguna \ Desktop> jika tidak ada. \ Ms-server-essential-docs mkdir. \ Ms-server-essential-docs

C: \ Users \ nama pengguna \ Desktop> pushd. \ Ms-server-essential-docs

C: \ Users \ nama pengguna \ Desktop \ ms-server-essential-docs> git init Menginisialisasi repositori Git kosong di C: / Users / nama pengguna / Desktop / ms-server-essential-docs / .git /

C: \ Users \ nama pengguna \ Desktop \ ms-server-essential-docs> git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git Memperbarui asal jarak jauh: Menghitung objek: 97, selesai. remote: Menghitung objek: 100% (97/97), selesai. remote: Mengompresi objek: 100% (44/44), selesai. jarak jauh: Total 145517 (delta 63), digunakan kembali 76 (delta 53), digunakan kembali paket 145420 Menerima objek: 100% (145517/145517), 751,33 MiB | 32,06 MiB / dtk, selesai. Menyelesaikan delta: 100% (102110/102110), selesai. Dari https://github.com/MicrosoftDocs/windowsserverdocs * [cabang baru]
1106-konflik -> origin / 1106-konflik * [cabang baru]
FromPrivateRepo -> origin / FromPrivateRepo * [cabang baru]
PR183 -> origin / PR183 * [cabang baru]
conflictfix -> origin / conflictfix * [cabang baru]
eross-msft-patch-1 -> origin / eross-msft-patch-1 * [cabang baru]
master -> origin / master * [cabang baru] patch-1
-> origin / patch-1 * [cabang baru] repo_sync_working_branch -> origin / repo_sync_working_branch * [cabang baru]
shortpatti-patch-1 -> origin / shortpatti-patch-1 * [cabang baru]
shortpatti-patch-2 -> origin / shortpatti -patch-2 * [cabang baru]
shortpatti-patch-3 -> origin / shortpatti-patch-3 * [cabang baru]
shortpatti-patch-4 -> origin / shortpatti-patch-4 * [cabang baru]
shortpatti-patch -5 -> origin / shortpatti-patch-5 * [cabang baru]
shortpatti-patch-6 -> origin / shortpatti-patch-6 * [cabang baru]
shortpatti-patch-7 -> origin / shortpatti-patch-7 * [cabang baru]
shortpatti-patch-8 -> origin / shortpatti-patch-8

C: \ Users \ nama pengguna \ Desktop \ ms-server-essential-docs> git config core.sparseCheckout true

C: \ Users \ nama pengguna \ Desktop \ ms-server-essential-docs> (echo EssentialsDocs) 1 >>. Git \ info \ sparse-checkout

C: \ Users \ nama pengguna \ Desktop \ ms-server-essential-docs> git pull origin master
Dari https://github.com/MicrosoftDocs/windowsserverdocs
* master cabang -> FETCH_HEAD

kayleeFrye_onDeck
sumber