Bir zulayı başka bir bilgisayara aktarma


296

Başka bir bilgisayara saklı bir değişiklik vermek için bir yol gerekir.

Bilgisayarda1 yaptım

$ git stash save feature

Stash yamasını bir dosyaya alıp başka bir bilgisayara aktarmaya çalışıyorum

$ git stash show -p > patch

Bu komut bana, bu repo'nun klonlandığı başka bir bilgisayara taşıyabileceğim bir dosya veriyor, ancak soru, bunu nasıl bir stash olarak içe aktaracağım.

Teşekkürler


6
fyi git stash saveartıkgit stash push
Ewan

Yanıtlar:


290

Yalnızca çalıştırarak bir yama dosyası uygulayabilirsiniz (değişiklikleri yapmadan)

git apply patchfile

Ardından, geçerli çalışma dizininden yeni bir stash oluşturabilirsiniz:

git stash

2
@Marcelo A: Duymak güzel, ancak lütfen kabul ettiğiniz cevapları yanıtın oy numarasının altındaki büyük onay işaretine tıklayarak işaretleyin. Bu şekilde sorunuz çözülmüş olarak işaretlenir.
dürtmek

2
Sistemin, sorunun sorulduğu zamandan (15 dakika, sanırım) geçene kadar OP'nin bir cevabı "kabul edildi" olarak işaretlemesine izin vermeyeceğini unutmayın.
Greg Hewgill

23
Bu cevabı okuduktan sonra merak ettiğim bir şey, tüm zillerimden belirli bir zuvanın nasıl seçileceğiydi. Bunun cevabı burada: stackoverflow.com/a/1910142/1148702 . Bu durumda git stash show "stash@{0}" -p > patchOP'nin ikinci kabuk komutu yerine şunu yaptım .
Tim Camber

1
@TimCamber etrafında çift tırnak gerekir sanmıyorum stash@{0}..
ari gold

2
@arigold Kullandığınız kabuğa bağlıdır. Örneğin PowerShell'de, kıvırcık parantezlerin orada özel bir sözdizimi olması nedeniyle bunlara ihtiyacınız var.
dürtmek

18

alternatif olarak, (bilgisayar 1'de) zulayı kullanarak bir şube oluşturabilirsiniz.

git stash branch stashed_changes_branch

değişikliklerinizi yapın:

git commit -a

sonra bilgisayar 2'de uzaktan kumanda olarak ekleyin:

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

şimdi kullanarak uzaktan bilgileri alabilirsiniz

git fetch pc1

şimdi taahhüdü istediğiniz şekilde içe aktarabilirsiniz; kullanılarak git kiraz-almak , git rebase ya da benzeri ... bunu sadece yokmuş gibi görünmek istiyorsanız ne olursa olsun git zulası uygulamak ; Kullanabileceğiniz almak kiraz-git no-taahhüt.


Computer1 ve computer2 arasında doğrudan bağlantınız yoksa; bir uzaktan kumanda kullanabilirsiniz (github veya benzeri bir şey):

git push origin stashed_changes_branch

ve bilgisayarda2:

git fetch

1
Bu, kaynak sistemin (bilgisayar1), buraya inen çoğu insan için doğru olmayacağı harici bağlantıları almaya açık olduğunu varsayar. Şube yoluna gitmek istiyorsanız, neden sadece geçici bir dalı uzak orijine itip onu bilgisayardan çekmeyesiniz? Uzak dalı, tutmak istemezseniz, çeker çekmez silebilirsiniz. Git'teki şubeler o kadar ucuz ki onları kullanmamanın genellikle birkaç nedeni var.
bölünmez

@indivisible Bugün internete iki bilgisayar bağlamak için birçok fırsat olduğunu kabul etmiyorum. Yanıtta açıklanan teknik, devam etmekte olan bir çalışmanın bir dizüstü bilgisayardan bir LAN üzerindeki bir masaüstüne aktarılmasında faydalı olabilir. Hamachi gibi sanal bir vpn hizmeti bile, git çalıştıran bilgisayarlar arasında doğrudan internet üzerinden dosya aktarmak için kullanılır.
steampowered

1
@steampowered, bazı insanlar / durumlar için doğru olabilir , ancak bu çözümün çalışması ve yerel env / sisteminizi gelen trafiği kabul etmek için değiştirmek zor bir gereklilik olduğundan, gelecekteki okuyucular için dikkat çekmeye değer bir nokta olduğunu düşündüm. bence, böyle bir görev için "aşırı". Sistem (ler) iniz zaten açıksa, elbette bu cevabı kullanın - yanlış değil. Buraya inen kullanıcıların çoğunluğunun böyle bir durumda olmayacağını hissediyorum.
bölünmez

Stash'lar kesinleşmiş nesnelerdir ve bu nedenle zaten bir kesin karmaya sahiptirler (bkz. git stash list --oneline), Bu nedenle teknik olarak stash'ı yeni bir kesinleştirme nesnesine uygulamak zorunda değilsiniz. Başka bir deyişle, yeni bir şube oluşturmak gerekli değildir. Bununla birlikte, bir zulayı doğrudan bir uzaktan kumandaya itmek en azını söylemek zordur.
Tyler Crompton

15

Alternatif olarak, tüm yerel depoları aşağıdaki gibi başka bir bilgisayara aktarabilirsiniz

  • git pull hem eski hem de yeni git dizininizde.
  • .git klasörünü eski git dizininden yeni depoya kopyala

1
Sıkıştırılmış .git katranı 700M + olmasına rağmen, özellikle birden fazla saklamam olduğu için önerilen diğer çözümlerden çok daha kolay olduğu ortaya çıktı.
Chris Warth

5

SourceTree'de Stash nasıl dışa aktarılır:

  1. Stash'ınızı kullanacağınız bir şubeden yeni bir "StashTransfer" dalı oluşturun
  2. Zulanızı ona uygulayın ve bir taahhütte bulunun

  3. Taahhüdünüzü tıklayın ve ondan bir yama yapın, yama dosyasını yanınıza alın.

  4. Farklı bir depoya gidin, az önce kullandığınız aynı ana dalı seçin 1)

  5. Eylemler / Yama Uygula, Mod'u seçin: Çalışan kopya dosyalarını değiştirin, Yama Uygula'ya basın, şu anki çalışma ortamınızdaki yamadan taahhüt edilmemiş değişiklikleriniz var

  6. Mevcut repo için yeni bir Stash yap


4

Stash'ı bir makineden yama dosyası olarak oluşturabilir, ardından bu yama dosyasını başka bir makineyle paylaşabilirsiniz.

Zulayı yama olarak oluşturma

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

"Stash @ {0}" stash'ın ref'sidir ve en son stash ile yama dosyası oluşturur. Farklı bir tane istiyorsanız $ git stash list, saklamak listenizi görmek için komut kullanın ve hangisini yamalamak istediğinizi seçin.

Düzeltme ekini uygulama

Şimdi bu zulayı başka bir makineye aktarın ve projenizin kök klasörüne yapıştırın. Sonra bu komutu çalıştırın

$ git apply changes.patch

Hata varsa ve değişikliği geri almak istiyorsanız

$ git apply changes.patch --reverse

3

Başka bir seçenek olan bir bilgisayardan başka bir bilgisayardan klasöre. rsync.gitrsyncyalnızca dosya değişikliklerini işler (bir kopyadan daha hızlı).

Bu yaklaşımın bir dezavantajı, iki makine arasında farklı .git yapılandırmaları çalıştırırsanız istenmeyecek olan yapılandırmaların da üzerine yazılacağıdır. Ancak, içindeki --excludeseçenekle dosyaları hariç tutarak bunun üstesinden gelebilirsiniz .rsync .

Genel olarak yerel bir Git çözümü daha temiz olduğunu düşünüyorum, ancak bu rsynckesmek acele rsync git git daha tanıdık olabilir biri için iyi olabilir.


3

Orijinal gönderinin başlangıç ​​komutu:

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

benim için çalışmadı (bir nedenle kullanılamaz yama dosyaları oluşturdu). Bunun yerine:

git stash apply stash@{x}
git commit

transfer etmek istediğim her saklamak için. Sonra, 'parent' repo'yu dosyaya yerleştirdim: /// 'child' repo'nun erişimi ve her bir saklanma işlemi için aşağıdakileri yaptım:

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

Bu daha karmaşık ama benim için hile yaptı.


0

Değişikliklerinizi bir makineden diğerine taşımak istiyorsanız, değişikliklerinizi her zaman makinenizde yapabilir ve ardından makinelerinde yumuşak bir sıfırlama yapabilirsiniz.

Ofis

git commit -m "-stash-"

Mutfak

git reset --soft HEAD~1


0

Stash, temel işlem ile dizin arasındaki çalışma ağacının özel birleştirme işlemidir. Bir yol, her birini ayrı yamalar olarak kaydetmek, ilk üst ebeveynini kontrol etmek, dizini ve çalışma ağacını iki yamadan geri yüklemek ve son olarak saklamayı geri yüklemek olabilir (bir cevap bu şekilde gider).

Bu, saklanan tüm bilgileri tamamen yeniden oluşturmak için gereklidir ve eğer bunu umursamıyorsanız, çatışmaları önlemek ve saklamanın nerede oluşturulduğunu takip etmek için en azından saklamanın ilk ebeveynini kontrol etmelisiniz.

Tüm depoları bir repodan diğerine tamamen geri yüklemek için yaptığım şey bu. Bunları aynı bilgisayarda edemiyorsanız, stash etiketlerini oluşturduktan sonra bir pakete kaydedebilir ve refs listesini kopyalayıp hedef bilgisayara paketleyebilirsiniz.

Orijinal repo kökünden:

  1. Stash referanslarının listesini alın
  2. Git getirme ile alabilmeniz için saklamak referanslarınızı etiketleyin (etiket adları mater yok, bir çakışma varsa değiştirin. stash_ + Mantıksal stash ref içindeki sayıları )
  3. Mantıksal referansları ters sırayla sha1 karmalarına dönüştürün - daha sonra kullanacağız
  4. Bu repo yolunu kaydedin - daha sonra için de
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

Not: Bu, bash veya uyumlu kabuk gerektirir (ksh, zsh yapmalıdır ...) Ayrıca bir değişkeni artırabilirsiniz, örneğin stash_$((i++))kabuğunuz desteklemiyorsa${param//pattern}

Şimdi yeni repoda, her ref için:

  1. Eski repodan ref getir (etiket adlarını kullanmamıza bile gerek yok, çünkü onları etiketledik, git getirme ile alabiliriz)
  2. Bu ref'nin konusunu stash mesajı olarak kullanarak, stash'ı ref'den yeniden içe aktarın.
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.