Git deposundan bir dosyayı nasıl silebilirim?


1922

"file1.txt"Git deposuna bir dosya ekledim . Bundan sonra, bunu taahhüt ettim, dir1ve adlı birkaç dizin ekledim dir2ve Git deposuna taahhüt ettim .

Şimdi cari depo vardır "file1.txt", dir1ve dir2. Nasıl silebilirsiniz "file1.txt"gibi, başkalarına etkilemeden dir1ve dir2?


85
git rmdoğru cevaptır, ancak dosyanın tarihte hala orada olacağını unutmayın. Bir dosyayı hassas bilgileri olduğu için kaldırmak istiyorsanız, daha sert bir şey yapmanız gerekir. (Özellikle daha önce itmiş olduğunuz içerik için geçmişin değiştirilmesi büyük bir işlemdir ve mümkünse kaçınılmalıdır.)
Keith Thompson,

8
Not: GitHub'da artık bir dosyayı web arayüzünden doğrudan silebilirsiniz (repoyu klonlamak zorunda kalmadan). Bkz aşağıda Cevabımı .
VonC

4
@KeithThompson Bunu umutsuzca yapmak istersem hangi adımlar olabilir?
lessthanl0l


Yanıtlar:


3219

Kullanın git rm.

Dosyayı Git deposundan ve dosya sisteminden kaldırmak istiyorsanız , şunu kullanın:

git rm file1.txt
git commit -m "remove file1.txt"

Ancak dosyayı yalnızca Git deposundan kaldırmak ve dosya sisteminden kaldırmak istemiyorsanız, şunu kullanın:

git rm --cached file1.txt
git commit -m "remove file1.txt"

Ve değişiklikleri uzaktan repoda zorlamak için

git push origin branch_name  

92
Ayrıca kullanışlı: git rm -r directory // Dizini ve içeriği kaldırmak için
Reg

10
Yine de bu dosya diğer komisyonlarda kurtulmayacaktır.
VaTo

6
@SaulOrtega: Doğru. Bir dosyayı önceki işlemlerden kaldırmak için (geçmiş geçmişini değiştirerek), GitHub'ın Hassas verileri kaldırma hakkındaki yardım sayfasına bakın .
Greg Hewgill

15
Bunun dosyayı yerel olarak da sileceğini unutmayın. Sadece depodan silmek istiyorsanız: git rm --cached file1.txt
Weston Ganger

5
Bu dosya hassas bilgiler (ör. Kimlik bilgileri) içeriyorsa, bu kimlik bilgilerini hemen değiştirmeniz gerektiğini belirtmek gerekir . GitHub'a alıntı yapmak için "GitHub'a bir taahhütte bulunduğunuzda, içerdiği tüm verilerin güvenliği ihlal edildiğini düşünmelisiniz. Bir şifre koyduysanız, değiştirin! Bir anahtar taahhüt ederseniz, yeni bir şifre oluşturun."
c1moore

608

git rm file.txtdosyayı depodan kaldırır, ancak yerel dosya sisteminden de siler .

Repo dosyayı kaldırın ve değil yerel dosya sistemi kullanımından silin:
git rm --cached file.txt

Aşağıdaki kesin durum nereye git işimin web sitesi için sürüm kontrolü korumak için kullanılır, ancak "mickey" dizini özel içerik CAD geliştirici ile paylaşmak için bir tmp klasörü oldu. BÜYÜK dosyalara ihtiyaç duyduğunda, özel, bağlantısız bir dizin oluşturdum ve dosyaları tarayıcı aracılığıyla getirmesi için ftpd yaptım. Bunu unuttum, daha sonra git add -Aweb sitesinin temel dizininden bir performans gerçekleştirdim . Daha sonra, git statustaahhüt edilmesi gereken yeni dosyaları gösterdi. Şimdi onları git'in izleme ve sürüm kontrolünden silmem gerekiyordu ...

Aşağıdaki örnek çıktı, .003dosyayı istemeden sildiğim yerde oldu . Neyse ki, yerel kopyaya ne olduğu umurumda değil .003, ancak şu anda değiştirilen diğer dosyalardan bazıları web sitesine yeni yaptığım güncellemelerdi ve yerel dosya sisteminde silinmiş destansı olurdu! "Yerel dosya sistemi" = canlı web sitesi (harika bir uygulama değil, gerçek) .

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

Güncelleme: Bu cevap biraz trafik alıyor, bu yüzden diğer Git yanıtımdan birkaç harika kaynak paylaştığını söylemiştim : Bu sayfada Git'i benimsemeye yardımcı olan bir grafik var. "Pro Git" kitabı çevrimiçi ve bana çok yardımcı olur.


6
Daha sonra böyle bir şeyle uğraşmanız gerekir git commit -m "Just removing file1.txt"ve daha sonra uzak bir deponuz varsa, taahhüdü böyle bir şeyle itin git push origin master.
ban-geoengineering

77

İlk olarak, git rmözellikle birden fazla dosya için kullanıyorsanız , herhangi bir joker karakterin gitkomut tarafından değil, kabuk tarafından çözüleceğini düşünün .

git rm -- *.anExtension
git commit -m "remove multiple files"

Ancak dosyanız zaten GitHub üzerindeyse , (Temmuz 2013'ten beri) doğrudan web GUI'sinden silebilirsiniz!

Deponuzdaki herhangi bir dosyayı görüntüleyin, üstteki çöp tenekesi simgesini tıklayın ve kaldırmayı diğer web tabanlı düzenlemeler gibi yapın.

Sonra git pullyerel deponuzda " " yazılır ve bu da dosyayı yerel olarak da siler.
Bu da git repo'dan bir dosyayı silmek için (dolambaçlı) bir yol yapar?
(GitHub üzerinde bir dosya bahsetmiyorum bile olan bir "git repo" olarak)


sil düğmesi

(taahhüt, dosyanın silinmesini yansıtacaktır):

bir silme yapmak

Ve aynen böyle, gitti.

Bu özelliklerle ilgili yardım için , dosya oluşturma , taşıma , yeniden adlandırma ve silme hakkındaki yardım makalelerimizi okuyun .

Not: Bir sürüm kontrol sistemi olduğundan, dosyayı daha sonra kurtarmanız gerekiyorsa Git her zaman arkanıza sahiptir.

Son cümle, silinen dosyanın hala geçmişin bir parçası olduğu anlamına gelir ve dosyayı yeterince kolayca geri yükleyebilirsiniz (ancak henüz GitHub web arayüzü üzerinden değil):

Bkz. " Git deposunda silinmiş bir dosyayı geri yükleme ".


4
Aşağı kaydırmak ve silmek için "Değişiklikleri yap" tuşuna basın!
LevinsonTechnologies

1
Bu büyük metin dosyaları için çalışmaz. Sunucu dosyayı ekran görüntüsünde olduğu gibi oluşturmaya çalışır ve 500 hatasıyla başarısız olur.
CapeCoder

9
Bu cevap github'a atıfta bulunuyor, soru bir git repo hakkında. Github arayüzünün nasıl kullanılacağı değil.
Peter Marshall

65

Benim için işe yarayan tek seçenek bu.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Not: * .sql dosyasını dosya adınız veya dosya türünüzle değiştirin. Çok dikkatli olun, çünkü bu her işlemden geçer ve bu dosya türünü kopyalar.

EDIT: dikkat - bu komuttan sonra itmek veya çekemezsiniz - itmek veya çekmek için 'git push --force -u origin master' kullanabilirsiniz 'ilgisiz geçmiş' reddetme göreceksiniz


9
Bu harika bir yanıttır, ancak diğer yanıtların aksine, bu komutun kayıt geçmişini yeniden yazdığını ve kalıpla eşleşen dosyaların tüm izlerini kaldırdığını unutmayın. Bu, özellikle bazı hassas bilgileri yanlışlıkla işlediğinizi bulursanız yararlıdır (ve gerekirse, itilen herhangi bir uzak deponun geçmişini yeniden yazmak için --force'u başarıyla kullanabilir).
yoniLavi

3
Tam olarak yaşadığım sorun buydu ve bunu düzeltmek için deneme yanılma aldı. Birlikte çalıştığım bir adam, birçok komisyondan geçen bir repoya birkaç büyük veritabanı dökümü yapmıştı. Bu yüzden örneğimde .sql kullandım. Reporum o kadar şişti ve büyüktü ki github artık itmeyi kabul etmeyecekti.
Jason Glisson

3
Uzak bir usta kullanıyorsanız, bir taahhüdü zorlamanız ve yukarı itmeniz gerekirgit push --force -u origin master
AlbertMarkovski

2
@AlbertMarkovski Üzgünüm spesifik değildim. Github aslında itmeyi kabul etmiyordu çünkü repo boyut sınırlarının ötesindeydi. En az birkaç GB. Beni kesip e-postayla gönderdiler. Ne yazık ki, bu noktada hiçbir zorlama zorlamaya yardımcı olmaz.
Jason Glisson

2
@JasonGlisson Bir videonun kazayla bir depoya eklendiği sorunla da karşılaştım.
AlbertMarkovski

34

Ayrıca, kaldırılacak bir klasörse ve sonraki alt klasörler veya dosyalarsa şunları kullanın:

git rm -r foldername

2
Bu, klasörü yerelden de kaldırır! Use git rm --cached -r <foldername>
Eksen

24

Daha genel olarak, git helpbunun gibi en azından basit sorulara yardımcı olacaktır:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

6
Daha karmaşık şeyler için git helpkafa karıştırıcı buluyorum , ama basit şeyler için iyi :)
James Polley

9
Git noobs için o kadar da büyük değil çünkü "index" git noobs'un bildiği bir kavram değil. Ben bir git çaylak :) Ayrıca, çok daha az olduğunu söylemek kafa karıştırıcı hissetmek olmanın kişisel deneyimlerime dayanarak söylüyorum rm silinmek üzere bir dosya aşamaları yerine dizinden uzaklaşmaların (hala acemi olanların anlamsız olsa da).
Roman Starkov

Romkyns ile hemfikir olmak: "Dosyaları çalışma ağacından ve dizinden kaldır" açıklaması bana dosyayı depodan kaldırmanın bir yolu gibi gelmiyor. Belki git daha iyi anlasaydım. Bunun yerine sadece dosyaları bozuyormuşsunuz gibi geliyor (ve isteğe bağlı olarak bunları çalışma ağacından kaldırıyorsunuz - bu mutlaka
repoyu

14

Dosyayı depodan silmek, ancak dosya sisteminde bırakmak istiyorsanız (izlenmez):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Dosyayı depodan ve dosya sisteminden silmek istiyorsanız, iki seçenek vardır:

  1. Dosyanın dizinde hiçbir değişikliği yoksa:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Dosya dizinde değiştirilmiş değişikliklere sahipse:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

12

git rm bundan sonra yalnızca bu daldaki dosyayı kaldıracaktır, ancak geçmişte kalır ve git bunu hatırlar.

Bunu yapmanın doğru yolu git filter-branch , diğerlerinin de belirttiği gibi. Bu dosyayı silmek için şubenin geçmişindeki tüm işlemleri yeniden yazacaktır.

Ancak, bunu yaptıktan sonra bile, git hatırlayabilir, çünkü reflog, uzaktan kumandalar, etiketler ve benzerlerinde referanslar olabilir.

Tek adımda tamamen silmek istiyorsanız, kullanmanızı tavsiye ederim git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

Kolay, sadece yap git forget-blob file1.txt .

Bu, her başvuruyu kaldıracak, yapacak git filter-branchve son olarak depodaki git gcbu dosyadan tamamen kurtulmak için git çöp toplayıcısını çalıştıracaktır .


10

Başka bir yol, rm komutunu kullanarak dosyayı yerel klasörünüzden silmek ve ardından değişiklikleri uzak sunucuya göndermek istiyorsanız.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

10

Not: yalnızca git kullanımından dosyayı silmek istiyorsanız, aşağıdaki talimatları kullanın:

git rm --cached file1.txt

Sabit diskten de silmek istiyorsanız:

git rm file1.txt

Bir klasörü kaldırmak istiyorsanız (klasör birkaç dosya içerebilir), aşağıdaki gibi özyinelemeli komut kullanarak kaldırmalısınız:

git rm -r foldername

Başka bir klasörün içindeki bir klasörü kaldırmak istiyorsanız

git rm -r parentFolder/childFolder

Ardından şunları yapabilirsiniz commitve pushher zamanki gibi. Ancak, silinen klasörü kurtarmak istiyorsanız, bunu takip edebilirsiniz: silinmiş dosyaları git'ten kurtarmak mümkündür.

Doc:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

SEÇENEKLER

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

Onlardan kabuk kaçmak gerekebilir. Dizindeki tüm dosyaları ve özyinelemeli olarak tüm alt dizinleri kaldırmak için önde gelen bir dizin adı (örneğin dir / file1 ve dir / file2 kaldırmak için dir) verilebilir, ancak bu açıkça -r seçeneğinin verilmesini gerektirir. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

komut satırı seçenekleri). --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Resmi doktor hakkında daha fazla bilgi edinin.


7

Belirli bir dosyayı silmek için

git rm dosya adı

İzlenmeyen tüm dosyaları bir dizinden tek seferde yinelemeli olarak temizlemek için

git clean -fdx


5

Windows için GitHub uygulamanız varsa, bir dosyayı 5 kolay adımda silebilirsiniz:

  • Senkronize Et'i tıklayın.
  • Dosyanın bulunduğu dizine tıklayın ve dosyanın en son sürümünü seçin.
  • Araçları tıklayın ve "Burada bir kabuk açın" ı seçin.
  • Kabuğa şunu yazın: "rm {dosyaadı}" ve enter tuşuna basın.
  • Değişikliği yapın ve yeniden senkronize edin.

5

Benim durumumda birkaç işlemden sonra github'daki dosyayı kaldırmaya çalıştım ama bilgisayara kaydettim

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

ve daha sonra bu dosya yoksayıldı


3
  1. İlk olarak, dosyaları yerel depodan kaldırın.

    git rm -r Dosya Adı

    veya dosyaları yalnızca yerel depodan değil, dosya sisteminden kaldırın

    git rm - önbellekli Dosya Adı

  2. İkincisi, Yerel depoya değişiklikleri kaydedin.

    git commit -m "unwanted files or some inline comments"   
    
  3. Son olarak, yerel değişiklikleri güncelleyin / uzak depoya aktarın.

    git push 
    

bu yanlışlıkla eklenen ve aktarılan dosyayla ilgili her şeyi kaldırır mı?
bapors

1

Önerilen seçeneklerin birçoğunu denedim ve hiçbiri işe yaramadı (çeşitli sorunları listelemeyeceğim). Yaptığım, işe yarayan, basit ve sezgiseldi (bana göre):

  1. tüm yerel repoyu başka bir yere taşı
  2. Repoyu master'dan yerel sürücünüze tekrar klonlayın
  3. # 1'deki orijinal kopyanızdaki dosyaları / klasörü # 2'den yeni klonuna geri kopyalayın
  4. sorun büyük dosyasının orada olmadığından veya .gitignore dosyasında dışlanmadığından emin olun
  5. her zamanki git add add / git commit / git push

1

Dosyayı repodan kaldırdıktan sonra , dosyayı repo geçmişinden tamamen ve kolayca git rmsilmek için BFG Repo-Cleaner kullanabilirsiniz.


0

Yanlışlıkla 'değiştirilmiş dosyalar' listemi kirletmek istemediğim repoya yapan obj ve bin dosyalarım var

Uzaktan kumandaya gittiklerini fark ettikten sonra ,.gitignore

/*/obj
/*/bin

Sorun zaten uzaktan kumandada olmaları ve değiştiklerinde, değiştikçe açılır ve değiştirilen dosya listesini kirletir.

Onları görmeyi durdurmak için, tüm klasörü uzak depodan silmeniz gerekir.

Komut isteminde:

  1. CD'yi repo klasörüne (ör. C:\repos\MyRepo )
  2. SSIS \ obj'i silmek istiyorum. Görünüşe göre yalnızca en üst düzeyde silebilirsiniz, bu yüzden şimdi SSIS'e CD yapmanız gerekir: (ör.C:\repos\MyRepo\SSIS )
  3. Şimdi sihirli büyüyü yazın git rm -r -f obj
    • RM = kaldırma
    • -r = özyinelemeli olarak kaldır
    • -f = kuvvet anlamına gelir, çünkü gerçekten demek istedin
    • obj klasör
  4. Şimdi koş git commit -m "remove obj folder"

13 dosya değiştirildi 315222 silindi diyerek endişe verici bir mesaj aldım

Sonra CMD hattına bakmak istemediğim için Visual Sstudio'ya girdim ve uzaktan kumandaya uygulamak için bir Sync yaptım


0

Belirli bir uzantıdan (örneğin, derlenmiş dosyalar) dosyaları kaldırmanız gerekirse, hepsini bir kerede kaldırmak için aşağıdakileri yapabilirsiniz:

git remove -f *.pyc

0

Belgelere göre .

git rm --cached giant_file

Hassas veriler söz konusu olduğunda - dosyayı kaldırdığınızı söylemeyin, yalnızca bilinen son işleme dahil edin:

0. Son taahhüdü değiştirme

git commit --amend -CHEAD

Dosyayı tüm git geçmişinden silmek istiyorsanız, belgelere göre aşağıdakileri yapmanız gerekir:

1. Yerel geçmişinizden kaldırın

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Bu dosyayı .gitignore'a eklemeyi unutmayın (Eğer asla paylaşmak istemediğiniz bir dosyaysa (şifreler gibi):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Uzaktan kumandadan çıkarmanız gerekiyorsa

git push origin --force --all

4. Etiket yayınlarından da kaldırmanız gerekirse:

git push origin --force --tags

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.