Git checkout / pull dizinleri kaldırmıyor mu?


84

Repo @ github'ım var. Evde biraz iş yaptım ve onu github'a ittim. Bazı dosya ve dizinlerin silinmesini içeriyordu. Şimdi, dosyaları ve dizinleri silmeden önce kodun bir kopyasının bulunduğu çalışma kutumdayım.

Aşağıdakileri yayınladım:

git remote update
git checkout HEAD
git pull origin HEAD

Sahip olması gereken tüm dosyaları sildi, ancak dosyaların bulunduğu dizinleri silmedi.

İki soru:

  1. Neden dizinleri kaldırmadı?
  2. Mevcut durumda bunları kaldırmak için verebileceğim bir git komutu var mı?

Kabul edildi, git checkout HEAD hiçbir şey yapmıyor, çünkü HEAD şu anda teslim alınmış olan commit'i gösteren bir referans. Muhtemelen her iki durumda da usta olmaya gidiyordunuz.
Cascabel

HEAD aslında boş dizinleri silmek dışında her şeyi güncelledi. Dediğim gibi, gitmede yeniyim.
mculp

Olası kopyası "git çekme" yi yerel dosyaların üzerine yazmaya nasıl zorlarım? Hala bazı farklı çözümler istiyorsanız, lütfen oradaki yanıtları kontrol edin.
DrBeco

Yanıtlar:


153

Git, dizinleri izlemez, bu nedenle birleştirme veya başka bir değişiklik sonucunda boş olanları kaldırmaz. Ancak, kullanabileceğiniz git clean -fdizlenmeyen dizinleri (uzaklaştırmak için -fdbayrak araçları f izlenmeyen dosyaların ve orce çıkarılması d irectories).


4
Kafam karıştı. Öyleyse değişiklikleri yaptığımda / gönderdiğimde neden dizinler GitHub depomdan silindi?
mculp

1
Çalışan kopyanızdaki dizinler izlenmemiş dosyalar (gizli izlenmeyen dosyalar dahil) içeriyor olabilir ve bu nedenle boş görünebilir, ancak gerçekten değildir, bu nedenle Git onları kaldırmadı. git cleanelbette olacak.
mipadi

4
Bunun GitHub depolarının çıplak depolar olması (çalışan kopyaları yoktur) ile bir ilgisi olabilir, ancak yerel deponuzda var. GitHub kaynağından yeni bir depo klonlasaydınız, bu dizinlere sahip olmayacağınızı hayal ediyorum.
mipadi

18
Ancak elbette, komutu önce -n(kuru çalıştırma) ile çalıştırın -f, böylece neyin silineceğini görebilirsiniz. Özellikle sadece bu endişe verici dizinleri değil, izlenmeyen dosyaları da git clean -dkaldırdığı için .
Todd Owen

2
@EliGolin: seçeneği git cleangeçmediğiniz sürece .gitignore'da listelenen dosyaları silmez -x.
mipadi

4

Çalışma ağacını değiştiren çoğu işlemin bir parçası olarak (çekme, birleştirme, teslim alma, vb.) Git, bu işlemle boş olan tüm dizinleri kaldırır (yani, git son dosyayı kaldırdı).

git, tamamen boş olmayan hiçbir dizini kaldırmaz, bu nedenle dosyalarınızı gizlediyseniz veya yok saydıysanız, git'in izlenen son dosyayı bu dizinden kaldırması, git'in bu dizini kaldırabileceği anlamına gelmez. git bunu bir hata koşulu olarak görmediğinden şikayet etmeyecektir.


GitHub depomda dizin yok. Taahhüt ettiğimde dizinleri doğru bir şekilde kaldırdı. Ancak, teslim aldığımda / çektiğimde yalnızca dosyaları kaldırıyor. Dizinler boş. $ ls -al toplam 8 drwxr-xr-x 2 mculp mculp 4096 23 Eylül 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 30 Eylül 10:51 ../
mculp

1
"HEAD'i ustaya değiştirdi" ile ne demek istediğinden tam olarak emin değilim, " git checkout master" demek istediğini sanıyorum ama çoğu insan " Ustaya geçtim / kontrol ettim" derdi. Her neyse, git 'Zaten güncel' dediğinde. hiçbir şey yapmadığı anlamına gelir. git sadece bu dizinleri kaldıracaktır yapar boş.
CB Bailey

Kötü sözler. Bazı kişilerin yorumlarda önerdiği gibi "HEAD" i "usta" olarak değiştirdim.
mculp

@CharlesBailey, söylediğin benim gördüğüm gibi değil. git checkouttamamen boş bir dizini kaldırmadı.
Acumenus

@ABB: Git sadece dizinleri kaldırır yapılmış bir çıkış ameliyatla boş. Bunu tekrar test ettim; hala çalışıyor.
CB Bailey

3

Benim durumumda, yapı hizmetinde (CI) aynı sorunu yaşadım .. GIT, klasörleri temizlemeden tüm dosyaları çekerken, daha önce CI tarafından oluşturulan tüm bin / nesneler kirli, bu yüzden bir test projesini kaldırırsam, bölme yine de DLL'yi içerecek ve var olmayan testlerden bahsedecektir.

Bu sorunu çözmek için; bu komut hile yapıyor gibi görünüyor (en azından benim için)

git clean -fd -x

burada X izlenmeyen tüm dosyaları kaldırır:

-X Yalnızca Git tarafından yok sayılan dosyaları kaldırın. Bu, her şeyi sıfırdan yeniden oluşturmak için yararlı olabilir, ancak manuel olarak oluşturulan dosyaları saklayın.


2

Git dizinleri, dosyaları (yollarıyla) izlemez. Git henüz yokmuş ancak vermez, (serin!) O yollara tüm dizinleri oluşturur değil bir yol içerdiği tüm dosyalar taşınmış veya silinirse bunları silmek (☹ soğutmak değil ... ama nedeni olabilir).

Çözüm (çektikten / hızlı ileri sarma / birleştirdikten sonra):

git stash --include-untracked
git clean -fd
git stash pop

Daha stashönce yapmazsanız clean, izlenmemiş tüm dosyalarınızı (geri dönüşü olmayacak şekilde) kaybedersiniz.

Not: Bu, yok sayılan tüm dosyaları da temizlediğinden, proje meta verilerini yeniden oluşturmak için bazı derleme komut dosyalarınızı yeniden çalıştırmanız gerekebilir (örn:) ./gradlew eclipse. Bu, boş olan ve asla git dosyalarının yollarının parçası olmayan dizinleri de siler.


-1

Git şu anda dizinleri izlemiyor ( git wiki'ye bakın ), yani ne boş dizinler ekleyemezsiniz ne de git boş kalan dizinleri kaldırmaz. (DÜZENLEME: Teşekkürler Manni, yanılmışım! Boş dizinler ekleyemezsiniz , ancak git, izlenen içerikleri silindiği için boş olan dizinleri kaldıracaktır . )

Boş dizinleri kaldırma komutuna gelince: bu, işletim sisteminize bağlıdır.

Linux için, örneğin,

find -depth -type d -empty -exec rmdir {} \;

Ancak bu, tüm boş dizinleri kaldıracaktır !


1
Wiki sayfası git'in sizin için boş dizinler oluşturmadığını söylüyor. O mu değil boş dizinleri silmez söylüyorlar. Mculp'un istediği benim için çalışıyor.
innaM

@janko, Aslında git, benim için tamamen boş bir dizini kaldıramadı.
Acumenus
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.