2015-09-25 19 views
12

BenGit: yinelemeli (yuvalanmış submodules) submodules hareketli

- git-repo a 
-- subdirectory 2015 
--- git-submodule b 
-- git-submodule c 
--- git-submodule d 

Ben 2015 bunu yapmak "kirli yollarla" biliyor klasöre c git alt modülünü taşımak istiyoruz aşağıdaki git yapıya sahip

Geçenlerde git mv yani çalışan, bunu yapmak mümkün olmalıdır okumak (yani/modüller dosyaları .git/yapılandırma değiştirerek ve .git dosyaların birkaç içinde gitdir değişen dahil)

git mv c 2015/ 

Bu, yuvalanmış alt modemin bulunmadığı depolar için iyi çalışır (benim durumumda d). Benim dizinde bu komutu çalıştırdığınızda, ancak ben

fatal: Not a git repository: d/../../.git/modules/c/modules/d 
fatal: 'git status --porcelain' failed in submodule 2015/c 

gibi hataları alıyorum (not bu hata yukarıda belirtilen hareket yürüttükten sonra bir git statüsüne ortaya çıkar)

bir farkında mı Bu hareketi yapmak için temiz yöntem (örneğin, .git/modules dosyalarındaki yolları manuel olarak değiştirmeyen bir yöntem)?

Düzenleme: (6/10/2015)

(ilk d tüm değişiklikler taahhüt ve itilmiş emin olun edilir git config dosyalarının herhangi değişiklikler içermeyen Bulunduğum iyi çözüm yere)

rm c/d -rf 
git mv c 2015 
cd 2015/c 
git submodule update 

Düzenleme: (8/10/2015)

daha da az müdahaleci geçici çözüm

git mv c 2015 
rm 2015/c/d/.git 
cd 2015/c 
git submodule update 

cevap

4

https://stackoverflow.com/a/32924692/2274140'da @VonC tarafından onaylandığı gibi, bu git mv dosyasında bir hatadır.

Bazı olası geçici çözümler vardır. En kolayı, .git dosyalarında karmaşık bir değişiklik yapılmasını gerektirmez (bu soruyu sorduğumdan beri bunu kullanıyorum). Aşağıdaki gibi çalışır:

git mv c 2015 
rm 2015/c/d/.git 
cd 2015/c 
git submodule update 

geçici olarak d subsubmodule içinde .git dosyayı kaldırır. Git altmodülü güncellemesi daha sonra bu .git dosyasını tekrar düzeltir. Benim geçerli çözüm gibi bir sürü kötü sesler https://stackoverflow.com/a/32924692/2274140

5

Güncelleme 2017:

son Git 2.14.x/2.15 (Q4 2017)

Heiko Voigt (hvoigt) tarafından commit c514167 (15 Eyl 2017) bakın

gýcýk belgeler. ( commit 450b908 içinde Junio C Hamano -- gitster -- ile Birleştirilmiş 2017 Eylül 25)

bu tespit ve yapılandırmaları (.gitmodules, worktree ve gitfile) için yolları güncelleme bir alt modülün ile git-mv kullanılmıştır.
Bu, kullanıcının alt modülünün kökünü yeniden adlandırdığı yinelemeli alt modüller için çalışmaz.


Orijinal cevap

2015 Sadece git 2.6 ile test edilmiştir.0 ve kendi iç içe submodules ile hareket eden alt birimlerinden (Windows üzerinde) sorunlu gibi görünüyor:

C:\Users\vonc\prog\git\tests\submove>git clone --recursive a a1 
Cloning into 'a1'... 
done. 
Submodule '2015/b' (C:/Users/vonc/prog/git/tests/submove/b) registered for path '2015/b' 
Submodule 'c' (C:/Users/vonc/prog/git/tests/submove/c) registered for path 'c' 
Cloning into '2015/b'... 
done. 
Submodule path '2015/b': checked out 'dc18955ec7b9ad0c04245968e2474646e4d593b2' 
Cloning into 'c'... 
done. 
Submodule path 'c': checked out 'fb4722eaca17ac171b7a2c8c5a1ac1e697f0ee85' 
Submodule 'd' (C:/Users/vonc/prog/git/tests/submove/d) registered for path 'd' 
Cloning into 'd'... 
done. 
Submodule path 'c/d': checked out '73cd7b8ff82519720b2fcca18df5ed00dd618b71' 

Ben:

a1 
    c 
    d 
    2015 
    b 

ben denemek ve 2015 alt klasöründe alt modülü c taşırsanız:

C:\Users\vonc\prog\git\tests\submove\a1>git mv c 2015/c 

C:\Users\vonc\prog\git\tests\submove\a1>git status 
fatal: Not a git repository: d/../../.git/modules/c/modules/d 
fatal: 'git status --porcelain' failed in submodule 2015/c 

ben d iç içe modülünde 2 şey değiştirmeniz gerekir bulundu:Oradan

git config -f .git/modules/c/modules/d/config core.worktree ../../../../../2015/c/d 

, bir git status eser, ama (emin olmak için) ister:

git config -f .git/modules/c/modules/d/config core.worktree ../../../../../2015/c/d 
                      ^^^^ 

2/d worktree değiştirin:

1 doğru yolu enjekte etmek elle .git/modules/c/modules/d/config değiştirmek/git submodule sync --recursive:

( )( ) Thebu değişikliği ben eklemek

C:\Users\vonc\prog\git\tests\submove\a1>git status 
On branch master 
Your branch is up-to-date with 'origin/master'. 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

     modified: .gitmodules 
     renamed: c -> 2015/c 

ve taahhüt: Şimdi hamle kontrol etmek o repo klonlamak

C:\Users\vonc\prog\git\tests\submove\a1>git add . 

C:\Users\vonc\prog\git\tests\submove\a1>git commit -m "move sub c in 2015/c" 
[master 8289632] move sub c in 2015/c 
2 files changed, 1 insertion(+), 1 deletion(-) 
rename c => 2015/c (100%) 

C:\Users\vonc\prog\git\tests\submove\a1>gl 
* 8289632 - (HEAD -> master) move sub c in 2015/c (3 seconds ago) <VonC> 
* 7ebb8e0 - (origin/master, origin/HEAD) a with sub c (38 minutes ago) <VonC> 

gerçekten düzgün kaydedildi:

C:\Users\vonc\prog\git\tests\submove>git clone --recursive a1 a2 
Cloning into 'a2'... 
done. 
Submodule '2015/b' (C:/Users/vonc/prog/git/tests/submove/b) registered for path '2015/b' 
Submodule 'c' (C:/Users/vonc/prog/git/tests/submove/c) registered for path '2015/c' 
Cloning into '2015/b'... 
done. 
Submodule path '2015/b': checked out 'dc18955ec7b9ad0c04245968e2474646e4d593b2' 
Cloning into '2015/c'... 
done. 
Submodule path '2015/c': checked out 'fb4722eaca17ac171b7a2c8c5a1ac1e697f0ee85' 
Submodule 'd' (C:/Users/vonc/prog/git/tests/submove/d) registered for path 'd' 
Cloning into 'd'... 
done. 
Submodule path '2015/c/d': checked out '73cd7b8ff82519720b2fcca18df5ed00dd618b71' 

olarakbeklenen sonucu göstermektedir Gördüğünüz gibi c ve c/d beklenen 2015/ alt klasöründe bulunur:

C:\Users\vonc\prog\git\tests\submove>cd a2 

C:\Users\vonc\prog\git\tests\submove\a2>dir 2015\c 

Directory of C:\Users\vonc\prog\git\tests\submove\a2\2015\c 

03/10/2015 18:10 <DIR>   . 
03/10/2015 18:10 <DIR>   .. 
03/10/2015 18:10    29 .git 
03/10/2015 18:10    40 .gitmodules 
03/10/2015 18:10 <DIR>   d 
       2 File(s)    69 bytes 
       3 Dir(s) 23 656 910 848 bytes free 

C:\Users\vonc\prog\git\tests\submove\a2>dir 2015\c\d 

Directory of C:\Users\vonc\prog\git\tests\submove\a2\2015\c\d 

03/10/2015 18:10 <DIR>   . 
03/10/2015 18:10 <DIR>   .. 
03/10/2015 18:10    42 .git 
03/10/2015 18:10     3 d.txt 
       2 File(s)    45 bytes 
       2 Dir(s) 23 656 910 848 bytes free 
+0

: gitdir geçici kaldırmayı önlemek diğer çözümler için

, bu cevaba bakınız. Yine de teşekkürler. – BartBog

+0

@BartBog, optimize edilmiş ve daha kesin bir çözüm olarak ses çıkarır. Bu bir git hatasıysa, daha iyi bir yanıt alacağınızı düşünmüyorum. – VonC

+0

Yapılandırma dosyalarının manuel olarak düzenlenmesini gerektirmediğinden, bunun yerine git komutları ile çalışma notlarını düzenlediği için aslında biraz daha az kirli. Yine de kullanımı oldukça zor. Şimdi benim sorumu güncelleştirmek için yeni alt akışımı da içerecek şekilde güncelledim. Bu işlem, harekete geçmeden önce alt modülden (d) çok iyi çalışıyor ve karmaşık modifikasyonlar içermiyor) – BartBog

İlgili konular