Önceden check-in yapan bir dizinin içeriğini yoksayıyor musunuz?


227

Sadece birkaç projede kullanılan grafik ve ses dosyalarını tutmak için kullanılan bir git depom var. Hepsi alt dizinleri olmayan bir dizinde. Şimdi, bu varlıkları başka bir alt dizine sahip, yapılandırılmış bir dizinden kopyalamak için bir komut dosyası oluşturdum.

Şimdi sadece (kaynak) hiyerarşik dosya yapısının git tarafından izlenmesini istiyorum ve (hedef) düz dizin (bir yığındaki tüm dosyalar ile) göz ardı edilmelidir.

Hedef dizini .gitignore'a ekledim, ancak git hala içindeki değişiklikleri izliyor. Hedef dizinde eski dosyanın silinmesini taahhüt edersem, git yeni içeriği (komut dosyası tarafından kopyalanır) izlemeyi durdurabileceğini düşündüm, ama öyle değil.

Git'in hedef dizini unutmasını nasıl sağlayabilirim?


Dizin adı nedir ve ne koydunuz .gitignore
mmmmmm

1
Adı DirNameIrrelevant ve .gitignore içinde "DirNameIrrelevant", "DirNameIrrelevant /" ve "DirNameIrrelevant / *"
Felixyz

Yanıtlar:


524

Bu komut git'in dizininizi ve altındaki tüm dosyaları silmeden kaldırmasına neden olur:

git rm -r --cached <your directory>

-r seçenek dizininizdeki tüm dosyaların kaldırılmasına neden olur.

Bu --cachedseçenek, dosyaların çalışma kopyanızdan değil, yalnızca git dizininden kaldırılmasına neden olur. Varsayılan olarak git rm <file>silinir <file>.


Ah teşekkürler. Çok yararlı, ancak neden gerekli olması gerektiğini görmüyorum (neden dir .gitignore içine eklemek için yeterli değil?). --Cached'ın ne için olduğunu söyleyebilir misiniz?
Felixyz

Elbette. İki seçeneği tanımlamak için cevabımı değiştirdim.
Gordon Wilson

Bunun neden gerekli olduğuna gelince, sadece spekülasyon yapabilirim. İçerik oluşturucuların, projenizin önemli bölümlerini yanlışlıkla izleme risklerini azaltmak için dosyaların izlenmesinin açık olmasını istediklerini tahmin ediyorum. Teknik nedenlerin de olduğunu hayal ediyorum.
Gordon Wilson

15
Gitignore git'in hangi dosyalardan haberdar olacağını belirlemek için kullanılır; zaten izlenen dosyalar üzerinde bir etkisi yoktur. Kullanıcı başka şekilde yok sayılan dosyaları izlemek istiyorsa, git onlara izin verir. Bu ya add -fsizin durumunuz kullanılarak yapılabilir ya da sizin durumunuz olabilir. Gordon'un dediği gibi, bu yanlışlıkla bir grup dosyayı silmenizi engeller - depo gitignore değil ana listedir. Bu ayrıca, bir joker karakter kuralı tarafından göz ardı edilecek birkaç şeyi manuel olarak izlemenizi sağlar, bu da yararlı bulduğum bir şeydir.
Cascabel

-rseçenek "senin dizindeki bütün dosyaların kaldırılmasını neden" değil daha ziyade subdirs aracılığıyla Recurse.
MrE

78

İzlenen bir dosyaya (check-in) sahip olmanız gerekiyor, ancak yerel deponuzda ve uzak depoda tutarken bir dosyanın başka değişikliklerini izlemek istemiyorsanız, bu aşağıdakilerle yapılabilir:

git update-index --assume-unchanged path/to/file.txt

Bundan sonra bu dosyada yapılan herhangi bir değişiklik artık görünmeyecek git status.


1
OP bir dizin istemiş olsa da, tam olarak aradığım şey buydu - teslim edilen tek bir dosyadaki diğer değişiklikleri göz ardı ederek; Teşekkürler!
sdaau

1
bir dizini tamamen yoksaymak için 'git update-index --assume-unchanged dirName / *' kullanın. Sözdizimini bulmak biraz zaman aldı, burada '*' gerekli
J-Dizzle

1
Bunu nasıl tersine çevirebilirim?
Rhys

3
@Rhys tersine çevirmek:git update-index --no-assume-unchanged dirname/**/*
JobJob

3

blah/Git'e added adı verilen bir alt dizin için, aşağıdakilerin her ikisi de içindeki yeni dosyaları yok saymaya çalışır blah/. .Gitignore'a eklendi:

blah 
blah/*

1

TL; git deponuzu temizlemek ve yok sayılan TÜM öğelerinizin gerçekten yok sayıldığından emin olmak için DR :

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Not: Bir dizin belirtmenize gerek yoktur, bu şekilde tüm uzak depoyu temizlersiniz .

Okumak daha ileri gitmek için bu


0

Bunun kötü bir insan olup olmadığından emin değilim, ama işte gidiyor.

  1. Eklediğim *Generated*kök .gitignore dosyasına
  2. Saklamak istediğim dosyaları GeneratedFile.Whatever.ext olarak gönderdim. Kontrol edilmiş
  3. Bunu yaparken bir powershell komut dosyası çağırmak için posta çıkış git git kanca yaptım:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Kendim hakkında biraz kötü hissediyorum ... ama aslında işe yarıyor.


-2

Tamam, önce dizin tamamen boşken (ne eski ne de yeni dosyalar) bir check-in yapmanız gerekiyor ve daha sonra eklenen dosyalar göz ardı edilecektir. Eklemeden önce eski dosyaları ve yenilerini kaldırırsanız, yenileri yok sayılsa da repoya eklenir.

En azından bu durum benim için çalıştı. Herkes neler olup bittiği hakkında daha fazla fikir verebilir eğer hala harika olurdu.


1
Başka bir yerde söylediklerimizin kısa versiyonu - gitignore git'in ne farkında olacağını etkiler. Hakkında anlattığınız verilerle ne yapılacağını etkilemez (örneğin, veri havuzuna eklemek üzere yönlendirilmiş).
Cascabel

Bu nedenle, izlenen ve şimdi silinen dosyaların bu şekilde izlenmesi mantıklıdır, ancak eklenen dosyaların (bir sonraki işlemden önce yapılırsa) izlenmesi hala anlamsızdır , oysa ben 1) yoksay, 2) dosyaları sil, 3) taahhüt, 4) yeni dosya ekle, yeni dosyalar izlenmez.
Felixyz
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.