Değişikliklerimi bir git alt modülüne nasıl geri döndürebilirim?


270

Repoma eklediğim git alt modül (RestKit) var.

Oradaki bazı dosyaları yanlışlıkla değiştirdim ve kaynak sürüme geri dönmek istiyorum. Bunu yapmak için koşmaya çalıştım

Mac:app-ios user$ git submodule update RestKit

Ancak burada da görebileceğiniz gibi, bu hala "değiştirilmiş içerik" olduğu için çalışmadı:

Mac:app-ios user$ git status
...
#   modified:   RestKit (modified content)

Hatta

Mac:app-ios user$ git submodule update -f RestKit 

yerel olarak değiştirilmiş dosyaları geri almaz.
Bu alt modülün içeriğini nasıl sıfırlarım?


Eğer git reset --harddeğil işi, uzaktan şube belirterek ilk deneme yapar git reset --hard origin/<branch_name>.
Jerry K.

Yanıtlar:


208

Alt modülün dizinine gidin, ardından git reset --harddeğiştirilen tüm dosyaları son taahhüt edilen durumuna sıfırlamak için a yapın. Bunun taahhüt edilmeyen tüm değişiklikleri sileceğini unutmayın.


6
git submodule update (--init olmadan bile), aslında hiçbir şeyi değiştirmediğim zaman submodule "değişiklikleri" terk etmem için çalıştı. Alt modül dizinine giderseniz ve git durumu boşsa, sıfırlama yerine bunu deneyin.
Eklektik DNA

16
git submodule update --initbenim için çalıştı; olmadan --inithiç işe yaramadı.
Per Lundberg

Süper !! Alt modülde ithal ettiğim bir repoda değişiklikler yaptım. Ve bu, olması gerektiği şeye geri döndü.
Noitidart

2
reset --hard benim için çalışmadı, yerel modum nedeniyle alt modülüm hala deinit olamazdı.
malhal

33
@markshiz'e ek olarak, git submodule update -f --initbenim durumum için.
otiai10

280

Bunu, tüm alt modüller için, dizinleri değiştirmek zorunda kalmadan yapmak istiyorsanız,

git submodule foreach git reset --hard

Tüm alt modüllere uygulamak için özyinelemeli bayrağı da kullanabilirsiniz:

git submodule foreach --recursive git reset --hard


7
Bu, otomasyon için her alt modül dizinine cd yapmaya çalışmaktan çok daha iyi çalışır.
Travis Castillo

4
Ayrıca şunları da isteyebilirsinizgit submodule foreach --recursive git clean -x -f -d
yoyo

1
makinemde (Git 2.22.0 kullanan Windows) --recursive bayrağını kullanırken ikinci git komutunun etrafında tek tırnaklara ihtiyacım var ya da çalışmıyor: git submodule foreach --recursive 'git clean -x -f -d'
aatwo

196

Önceki tüm yanıtlardan daha güvenli bir yöntem:

git submodule deinit -f .
git submodule update --init

İlk komut tüm alt modülleri tamamen "bağlar", ikincisi daha sonra yeni bir ödeme yapar.
Diğer yöntemlerden daha uzun sürer, ancak alt modüllerinizin durumu ne olursa olsun işe yarayacaktır.


1
Maalesef bu benim durumumda işe yaramadı (git alt modülünde değiştirilmiş yerel dosyalarla), "update --init" komutu error: Your local changes to the following files would be overwritten by checkout
yazıyor

Belirli alt modülü güncellemek için şunları yapın: $ git submodule deinit -f - <submodule_path> ve sonra $ git submodule update --init - <submodule_path>
Priyank

Bunu bulana kadar yukarıdaki tüm yöntemleri denedim. Benim için bu benim git "temiz" görünümlü tek kişi olduğunu (olmadan *içinde benim açıklamak mümkün). PS1git status -uno
Guy Rapaport

60

Benim için,

git reset --hard

sadece alt modülü teslim aldığınız duruma sıfırlayın, ana deponun taahhüt / durumuna referans verdiği repo için gerekli değildir. OP'nin dediği gibi hala "değiştirilmiş içerikler" olacak. Bu nedenle, alt modülü düzeltmeler taahhüdüne geri döndürmek için koşuyorum:

git submodule update --init

Sonra yaptığımda git status, alt modülde temiz.


Maalesef submodule update --initbenim durumumda yerel değişiklikleri geri dönmek gibi görünmüyor: |
rogerdpack

48

4 adım ardışık yapın:

git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f

2
Bana da yardım eden tek kişi.
Victor Sergienko

soru, alt modül yeni ise, bu dizinde bir .git dosyası olmayacak, değil mi? git komut üst repo için kabarcık olacak?
santiago arizti

1
@jiahut Bunu yaptıktan sonra bile, ebeveynimden 'git status' yaparken alt modülümün yanında hala "(yeni taahhütler") var mı?
David Doria

1
@DavidDoria benim için git submodule updatesabit olan şeydi (new commits).
ubershmekel

31

Bu benim için işe yaradı, tekrar tekrar alt modüllere dahil (belki de -f çalışmadı, alt modülün içindeki bir alt modülü değiştirmene neden oldu):

git submodule update -f --recursive

11

İlk olarak, diğerlerinin söylediği gibi şunu deneyin:

git submodule update --init

Bu işe yaramazsa, alt modül dizinine geçin ve alt modülde herhangi bir değişiklik olup olmadığını görmek için aşağıdaki komutu kullanın:

git status

Alt modülünüzde değişiklikler varsa onlardan kurtulun. "Git status" komutunu çalıştırdığınızda hiçbir değişiklik göremediğinizi doğrulayın.

Ardından, ana depoya geri dönün ve "git submodule update --init" komutunu tekrar çalıştırın.


9

Git 2.14'ten (3. Çeyrek 2017) beri git reset(olduğu gibi git submodule foreach git reset --hard) her alt modüle gitmek zorunda değilsiniz.

Çünkü git reset'in kendisi, alt modüllere özyinelemeli olarak nasıl gidileceğini artık biliyor.

Bkz 35b96d1 taahhüt (2017 21 Apr) ve f2d4899 taahhüt , 823bab0 işlemek , cd279e2 taahhüt tarafından (18 Nisan 2017) Stefan Beller'in ( stefanbeller) .
(Göre Birleştirilmiş Junio Cı Hamano - gitster- içinde 5f074ca tamamlama 2017 29 May)

built / reset: add --recurse-submodules anahtarı

git-reset alt modüller hakkında öğretilmesi gereken başka bir çalışan ağaç manipülatörüdür.

Bir kullanıcı git-reset kullandığında ve alt modüllere yeniden toplama isteğinde bulunduğunda, alt modülleri üst projede kaydedildiği gibi HEAD'leri ayırarak nesne adına sıfırlar.

Uyarı : arasındaki fark:

  • git reset --hard --recurse-submodule ve
  • git submodule foreach git reset --hard

birincisi ana alt repo çalışma ağacınızı da sıfırlayacaktır, çünkü ikincisi sadece alt modüllerin çalışma ağacını sıfırlayacaktır.
Bu yüzden dikkatli kullanın.


7

Git <= 2.13 için bu iki komut birleştirildiğinde depolarınızı yinelemeli alt modüllerle sıfırlamanız gerekir:

git submodule foreach --recursive git reset --hard
git submodule update --recursive --init

3

Bu, bir DEV paket repo ve LIVE paket repo sahip GIT v1.7.1 çalıştıran kütüphanelerimizle çalışır. Depoların kendileri, bir proje için varlıkları paketlemek için bir kabuktan başka bir şey değildir. tüm alt modüller.

LIVE kasıtlı olarak asla güncellenmez, ancak önbellek dosyaları veya kazalar meydana gelebilir ve bu da depoyu kirli bırakır. DEV'ye eklenen yeni alt modüller LIVE içinde de başlatılmalıdır.

DEV'deki Paket Deposu

Burada henüz farkında olmadığımız tüm yukarı akış değişikliklerini çekmek istiyoruz, o zaman paket depomuzu güncelleyeceğiz.

# Recursively reset to the last HEAD
git submodule foreach --recursive git reset --hard

# Recursively cleanup all files and directories
git submodule foreach --recursive git clean -fd

# Recursively pull the upstream master
git submodule foreach --recursive git pull origin master

# Add / Commit / Push all updates to the package repo
git add .
git commit -m "Updates submodules"
git push   

LIVE'daki Paket Deposu

Burada DEV veri havuzuna taahhüt edilen, ancak bilinmeyen yukarı akış değişikliklerine bağlı olmayan değişiklikleri çekmek istiyoruz.

# Pull changes
git pull

# Pull status (this is required for the submodule update to work)
git status

# Initialize / Update 
git submodule update --init --recursive

2

Tüm modüldeki tüm değişiklikleri alt modüllerle birlikte atmak istiyorsanız,

git restore . --recurse-submodules

Bu, depoda ve alt modüllerde yapılan tüm değişiklikleri geri alır.


0

tüm alt modülleri sıfırlamak için benim yolum (onların "ana" dal ayırmak ve tutmak OLMADAN):

git submodule foreach 'git checkout master && git reset --hard $ sha1'

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.