Ekspor simpanan ke komputer lain

296

Saya perlu cara untuk mengekspor perubahan simpanan ke komputer lain.

Di Computer1 saya lakukan

$ git stash save feature

Saya mencoba untuk mendapatkan patch simpanan ke file dan kemudian mengimpornya ke komputer lain

$ git stash show -p > patch

Perintah ini memberi saya file yang bisa saya pindahkan ke komputer lain tempat repo ini dikloning, tetapi pertanyaannya adalah bagaimana cara mengimpornya sebagai simpanan lagi.

Terima kasih

Marcelo A
sumber
6
fyi git stash savesekarang tidak digunakan lagi untukgit stash push
Ewan

Jawaban:

290

Anda dapat menerapkan file tambalan (tanpa melakukan perubahan) dengan hanya menjalankan

git apply patchfile

Maka Anda cukup membuat simpanan baru dari direktori kerja saat ini:

git stash
menyodok
sumber
2
@Marcelo A: Baik untuk didengar, tetapi harap tandai jawaban yang Anda terima dengan mengklik tanda centang besar di bawah jumlah suara jawaban. Dengan begitu pertanyaan Anda akan ditandai telah diselesaikan.
colek
2
Perhatikan bahwa sistem tidak akan membiarkan OP menandai jawaban sebagai "diterima" sampai beberapa waktu (15 menit, saya pikir) telah berlalu sejak pertanyaan diajukan.
Greg Hewgill
23
Setelah membaca jawaban ini satu hal yang saya bertanya-tanya adalah bagaimana memilih simpanan tertentu dari semua simpanan saya. Jawabannya ada di sini: stackoverflow.com/a/1910142/1148702 . Dalam hal ini saya akhirnya melakukan: git stash show "stash@{0}" -p > patchbukannya perintah shell kedua OP.
Tim Camber
1
@TimCamber saya tidak berpikir Anda perlu tanda kutip ganda sekitar stash@{0}..
ari gold
2
@arigold Tergantung pada shell yang Anda gunakan. Misalnya di PowerShell, Anda memerlukannya karena kurung kurawal adalah sintaks khusus di sana.
colek
18

atau Anda dapat membuat cabang dari simpanan Anda (di komputer 1), menggunakan

git stash branch stashed_changes_branch

komit perubahan Anda:

git commit -a

kemudian tambahkan sebagai remote di komputer 2:

git remote add pc1 user@computer1:/path/to/repo

sekarang Anda dapat mengambil informasi jarak jauh menggunakan

git fetch pc1

sekarang Anda dapat mengimpor komit dengan cara yang Anda inginkan; menggunakan git cherry-pick , git rebase atau apa pun yang Anda suka ... Jika Anda ingin terlihat seperti Anda baru saja menggunakan git stash ; Anda dapat menggunakan git cherry-pick --no-commit.


Jika Anda tidak memiliki koneksi langsung antara komputer1 dan komputer2; Anda dapat menggunakan remote (seperti github atau yang serupa):

git push origin stashed_changes_branch

dan di computer2:

git fetch
Chris Maes
sumber
1
Ini mengasumsikan bahwa sistem sumber (komputer1) terbuka untuk menerima koneksi eksternal yang bagi kebanyakan orang mendarat di sini tidak mungkin benar. Jika Anda ingin pergi ke rute cabang mengapa tidak mendorong cabang temp ke asal jauh dan menariknya dari komputer2? Anda dapat menghapus cabang jarak jauh segera setelah Anda menarik jika Anda tidak ingin menyimpannya. Cabang-cabang di git sangat murah, biasanya ada beberapa alasan untuk tidak menggunakannya.
tidak dapat dibagi
@indivisible Saya tidak setuju ada banyak peluang untuk menghubungkan dua komputer di internet saat ini. Teknik yang dijelaskan dalam jawaban mungkin berguna untuk memindahkan pekerjaan yang sedang berlangsung dari laptop ke desktop di LAN. Bahkan layanan vpn virtual seperti Hamachi akan digunakan untuk mentransfer file melalui internet di mana saja langsung antara komputer yang menjalankan git.
dikemudikan
1
@steampowered, tentu itu mungkin benar untuk beberapa orang / situasi tapi saya pikir itu patut dicatat untuk pembaca di masa depan karena ini merupakan persyaratan sulit untuk solusi ini untuk bekerja dan memodifikasi sistem / env lokal Anda untuk menerima lalu lintas masuk membutuhkan konfigurasi yang tidak sepele itu, menurut pendapat saya, "berlebihan" untuk tugas seperti ini. Jika sistem Anda sudah terbuka maka tentu saja gunakan jawaban ini - itu tidak salah. Saya hanya merasa bahwa sebagian besar pengguna yang mendarat di sini tidak akan berada dalam situasi seperti itu.
tidak dapat dibagi
Stash adalah objek komit dan karenanya sudah memiliki hash komit (lihat git stash list --oneline), jadi Anda secara teknis tidak harus menerapkan simpanan ke objek komit baru. Dengan kata lain, membuat cabang baru tidak perlu. Namun, mendorong simpanan langsung ke kendali jarak jauh sulit untuk dikatakan.
Tyler Crompton
15

Sebagai alternatif, Anda dapat mengekspor seluruh simpanan lokal ke komputer lain sebagai berikut

  • git pull pada direktori git lama dan baru untuk memastikan bahwa keduanya memiliki perubahan terbaru.
  • salin folder .git dari direktori git lama ke repositori baru
shafeeq
sumber
1
Meskipun tar kompresi .git adalah 700M +, ini ternyata jauh lebih mudah daripada solusi yang diusulkan lainnya, terutama karena saya memiliki banyak simpanan.
Chris Warth
5

Cara melakukan ekspor Stash di SourceTree:

  1. Buat cabang baru "StashTransfer" dari cabang tempat Anda akan menggunakan Stash Anda
  2. Terapkan simpanan Anda padanya dan buat komit

  3. Klik komit Anda dan buat tambalan darinya, bawa file tambalan bersama Anda.

  4. Pergi ke repositori yang berbeda, pilih cabang induk yang sama yang baru saja Anda gunakan dalam 1)

  5. Tindakan / Terapkan Patch, pilih Mode: Ubah file copy yang berfungsi, tekan Terapkan Patch sekarang Anda memiliki modifikasi yang tidak dikomit dari patch di lingkungan kerja Anda saat ini

  6. Buat simpanan baru untuk repo saat ini

KEMBL
sumber
4

Anda dapat membuat simpanan sebagai file tambalan dari satu mesin, lalu dapat membagikan file tambalan itu ke komputer lain.

Membuat simpanan sebagai tambalan

$ git stash show "stash@{0}" -p > changes.patch

"Stash @ {0}" adalah referensi dari stash. Ini akan membuat file tambalan dengan simpanan terbaru. Jika Anda ingin yang berbeda gunakan perintah $ git stash listuntuk melihat daftar simpanan Anda dan pilih yang ingin Anda tambal.

Menerapkan tambalan

Sekarang transfer simpanan itu ke komputer lain dan tempel ke folder root proyek Anda. Kemudian jalankan perintah ini

$ git apply changes.patch

Jika ada kesalahan dan Anda ingin membalikkan perubahan

$ git apply changes.patch --reverse
Sam
sumber
3

Pilihan lain adalah untuk rsyncyang .gitfolder dari satu komputer ke komputer lain. rsynchanya memproses perubahan file (lebih cepat dari salinan).

Satu kelemahan dari pendekatan ini adalah konfigurasi juga akan ditimpa, yang mungkin tidak diinginkan jika Anda menjalankan konfigurasi git yang berbeda antara kedua mesin. Tapi Anda bisa mengatasi hal ini dengan tidak termasuk file dengan --excludepilihan dalam rsync.

Secara keseluruhan saya pikir solusi Git asli lebih bersih, tetapi rsyncperetasan ini bisa bagus untuk seseorang yang terburu-buru yang mungkin lebih akrab dengan rsync daripada git.

ditenagai uap
sumber
3

Perintah startup dari pos asli:

git stash show -p stash@{x} > patch_file

tidak berfungsi untuk saya (karena alasan tertentu itu membuat file tambalan yang tidak dapat digunakan). Sebaliknya saya harus:

git stash apply stash@{x}
git commit

untuk setiap simpanan yang ingin saya transfer. Kemudian, saya menempatkan repo 'induk' di dalam file: /// jangkauan repo 'child', dan melakukan yang berikut, untuk setiap simpanan komit:

git fetch file:///path_to_parent_git && git cherry-pick commit_sha
git reset --soft HEAD^
git stash save my_new_stash_on_child

Ini lebih kompleks tetapi melakukan trik untuk saya.

pizza
sumber
0

Jika Anda ingin memindahkan perubahan dari satu mesin ke mesin lain, Anda selalu dapat melakukan perubahan pada mesin Anda dan kemudian melakukan soft reset pada mesin mereka.

Kantor

git commit -m "-stash-"

Dapur

git reset --soft HEAD~1

Siriquelle
sumber
0

Stash adalah komit gabungan khusus dari pohon kerja antara komit dasar dan indeks. Salah satu caranya adalah dengan menyimpan masing-masing sebagai tambalan terpisah, checkout simpanan induk pertama, pulihkan indeks dan susunan pohon dari dua tambalan dan akhirnya pulihkan simpanan (sepertinya satu jawaban berjalan seperti ini).

Ini diperlukan untuk sepenuhnya menciptakan kembali semua informasi dari simpanan, dan jika Anda tidak peduli tentang itu Anda harus setidaknya memeriksa induk pertama simpanan sebelum memulihkan untuk menghindari konflik dan melacak di mana simpanan dibuat.

Inilah yang saya lakukan untuk sepenuhnya memulihkan semua simpanan dari satu repo ke repo lainnya. Jika Anda tidak dapat memilikinya di komputer yang sama, Anda dapat menyimpan tag simpanan dalam bundel setelah membuatnya dan menyalin daftar referensi dan bundel ke komputer target.

Dari akar repo asli:

  1. Dapatkan daftar referensi simpanan
  2. Tandai referensi simpanan Anda sehingga Anda dapat mengambilnya dengan git fetch (nama tag tidak mater, ubah jika ada konflik. Saya menggunakan stash_ + nomor pada ref simpanan logis)
  3. Konversi referensi logis ke hasa sha1 dalam urutan terbalik - kita akan menggunakannya nanti
  4. Simpan jalur repo itu - juga untuk nanti
refs=$(git stash list|cut -d: -f1)
for ref in $refs; do tag stash_${ref//[^0-9]} $ref; done
refs=$(git rev-parse $refs|tac)
oldpath=$PWD

NB: Ini membutuhkan bash atau shell yang kompatibel (ksh, zsh seharusnya melakukan ...) Anda juga bisa menambahkan variabel, misal stash_$((i++))jika shell Anda tidak mendukung${param//pattern}

Sekarang di repo baru, untuk setiap ref:

  1. Ambil ref dari repo yang lama (kita bahkan tidak perlu menggunakan nama tag, karena kita telah memberi tag kita, kita dapat mengambilnya dengan git fetch)
  2. Impor ulang simpanan dari ref, menggunakan subjek ref sebagai pesan simpanan.
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
Thomas Guyot-Sionnest
sumber