Zaten sildiğim büyük dosya nedeniyle GitHub'a aktarılamıyor


272

Şu anda sahibim

  1. GitHub deposunu boşalt
  2. SSH sunucusu repo (ana)
  3. Yerel Repo

SSH sunucusu repo en güncel repo (üretim sitesi) oldu, bu yüzden oradan yerel bir Git klon yaptım. Daha sonra git pushGitHub'a yapmaya çalıştım .

Her şey yolunda gitti ama sonra filename.gz GitHub için çok büyük olduğu hakkında bir şey söyledi. Bu dosyaya ihtiyacım yoktu, bu yüzden Git önbelleğinden kurtulmak için birkaç Git komutunu çalıştırdım ve sonra SSH sunucusuna geri döndüm.

Büyük dosyayı yerel olarak görmüyorum ama git diffhiçbir şey döndürmese ve git push "Her şey güncel" olsa bile hala SSH sunucusunda - Ve ben göndermeye çalıştığımda dosya yerel repo görünür olmasa bile GitHub Hala bu konuda hata alıyorum

uzak: hata: fpss.tar.gz dosyası 135.17 MB; bu GitHub'ın 100 MB dosya boyutu sınırını aşıyor

GitHub yardımında listelenen "sorunu çözme" altındaki adımları izledim, bu yüzden yeterli olmamalı mıydı?

Yerel olmadığında veya git status / diff / push içinde listelendiğinde dosya hala eterde nasıl olur?


2
Dosya hala tarihte var. Muhtemelen dosyayı ekleyen ve kaldıran taahhütleri ezerek tarihi yok etmeniz gerekir.
Shahbaz

@Shahbaz Bu sitede listelenen "sorunu çözme" altındaki adımları izledim ... bu yeterli olmamalı mıydı? help.github.com/articles/working-with-large-files
Kevin W.

Oradaki komut git bilgimden daha ileri, bu yüzden gerçekten söyleyemem. Her neyse, git log -- the_big_filesize bir şey döndürüyorsa, dosya hala geçmişte.
Shahbaz

@Nohbaz döndüren Şaşbaz> <
Kevin W.

Dosyanın bulunduğu diğer dalları da itiyor olabilir misiniz? Ayrıca, dosya hala sunucudaysa, neden git pushher şey günceldir? Tarihi değiştirdiğiniz için, itmenin mümkün olmadığı ve zorlamak zorunda kalacağınızdan şikayet etmiş olmalısınız.
Shahbaz

Yanıtlar:


446

Kullanabilirsiniz

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

Bu işlem, dosyanın geçmişindeki her şeyi silecektir. Sorun dosyanın geçmişte mevcut olmasıdır.

Bu komut, özellikle paylaşılan depolarda gerçek bir sorun olabilecek taahhütlerinizin karmasını değiştirir. Sonuçları anlamadan yapılmamalıdır.


23
Benim için çalıştım ama 'zorlamak zorunda kaldım: git filter-branch --index-filter' git rm -r --cached --ignore-unmatch <file / dir> '-f HEAD
alexoviedo999

30
Bu komut, özellikle paylaşılan depolarda gerçek bir sorun olabilecek taahhütlerinizin karmasını değiştirir. Sonuçları anlamadan yapılmamalıdır.
Chris

6
<File / dir> yerine soruna neden olan dosya veya dizin adını mı koymanız gerekiyor?
David

12
Bu değişiklikleri TÜM şubelere uygulamak istiyorsanız, --allbunun yerine bir bayrak kullanmanız gerektiğini unutmayınHEAD
Nick Spreitzer

9
Ben alıyorum:Rewrite 657560fa18c030bcfac9132ce1c3541e84a5bc2c (1/10) (0 seconds passed, remaining 0 predicted) /usr/lib/git-core/git-filter-branch: 1: eval: Syntax error: end of file unexpected
João Abrantes

68

Ezmeyi daha yararlı buldum filter-branch. Aşağıdakileri yaptım:

  1. Büyük dosyaları yerel olarak silin.
  2. Yerel silme işlemlerini gerçekleştirin.
  3. Kaydedilmesini Yumuşak sıfırlama arka X numarası (benim için 3 idi): git reset --soft HEAD~3.
  4. Sonra tüm değişiklikleri birlikte önerin (AKA squash) git commit -m "New message for the combined commit"
  5. İtme ezilmiş taahhüt.

Özel durum (user @lituo'dan): Yukarıdaki işlem işe yaramazsa, bu davaya sahip olabilirsiniz. 1.Bölüm büyük dosyayı içeriyordu ve 1.Bölümün push'u büyük dosya hatası nedeniyle başarısız oldu. 2.Komut büyük dosyayı tarafından kaldırıldıgit rm --cached [file_name]ancak 2.Komp'un itme işlemi hala başarısız oldu. Yukarıdaki adımları da uygulayabilirsiniz, ancak kullanmak yerineHEAD~3kullanınHEAD~2.


2
Benim için çalıştı, sadece squash itme işe başlamadan önce üç komisyon değişiklikleri yerel depoya yeniden birleştirmek zorunda kaldı.
dasWesen

5
Bu en iyi cevaptan çok daha iyi. En iyi yanıt tüm işlem geçmişinizi zorlar.
manic.coder

Benim sorunu çözmek vermedi
Hirak Sarkar

3
Bu, depoyu tamamen doldurmadan büyük taahhüt edilmemiş veya taahhüt edilmiş dosyaları düzelten tek cevaptır! :-)
Ælex

1
@ ama ben bir sarmalayıcı sınıf değilim: çok teşekkür ederim! Bu çekicilik gibi çalıştı :)
POOJA GUPTA

63

Yardım istemeden önce repo ile uğraştıysanız süper yararlı bulduğum bir şey. İlk tür:

git status

Bundan sonra, çizgiler boyunca bir şey görmelisiniz.

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Önemli olan kısım "2 taahhüt" dür! Buradan devam edin ve şunu yazın:

git reset HEAD~<HOWEVER MANY COMMITS YOU WERE BEHIND>

Yani, yukarıdaki örnek için, biri şöyle yazacaktır:

git reset HEAD~2

Bunu yazdıktan sonra, "git status" ifadeniz şöyle olmalıdır:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Oradan, büyük dosyayı silebilirsiniz (daha önce yapmadığınız varsayılarak) ve çalışmanızı kaybetmeden her şeyi yeniden işleyebilmeniz gerekir.
Bunun süper süslü bir cevap olmadığını biliyorum, ama umarım yardımcı olur!


11
Kazanan. Basit, temiz, etkili, git yerleşik çözüm. Aşk böyle cevaplar.
Reece Daniels

3
bu en iyi çözüm.
1919'da 16 Mart

40

Dosya olsaydı En son işlemek senin eklendi ve uzak depo itilmiş değil , dosyayı silip Alındığı işlemeye düzeltebilirler burada :

git rm --cached giant_file
    # Stage "giant_file" for removal with "git rm"
    # Leave it on disk with "--cached". if you want to remove it from disk
    # then ignore the "--cached" parameter
git commit --amend -CHEAD
    # Commit the current tree without the giant file using "git commit"
    # Amend the previous commit with your change "--amend" 
    # (simply making a new commit won't work, as you need
    # to remove the file from the unpushed history as well)
    # Use the log/authorship/timestamp of the last commit (the one we are
    # amending) with "-CHEAD", equivalent to --reuse-message=HEAD
git push
    # Push our rewritten, smaller commit with "git push"

1
Dosya artık git dizininde olmadığından bu çözüm çalışmaz ( untrackedgit status
.'de

Hiçbir şey olmuyor. Bunu uyguladıktan sonra toplam dosya sayısını azalttı, ancak işlem% 99'u gösterdikten sonra tekrar takıldı. Neyi kaçırdığım hakkında bir öneriniz var mı?
CoDe

4
-CHEAD anlamı ne?
Aerin

1
Bunu son bir taahhüt değil, belirli bir taahhütten denemek istersem ne olur? Denedim git rm --cached giant_file commit_idama işe yaramadı :(
puifais

@puifais Önceki taahhüdüne dönecek, bu adımları atacak ve daha sonra mevcut olanla birleşirdim. Bunun en iyi yaklaşım olup olmadığından emin değilim, ben bir Git uzmanı değilim
BlueMoon93

13

Benzer bir sorun yaşadım ve dosyayı kaldırmak için yukarıdaki adımı kullandım . Mükemmel çalıştı.

Sonra kaldırmak için gereken ikinci bir dosyada bir hata var: remote: error: File <path/filename> is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB

Aynı adımı denedim, bir hata aldım: "A previous backup already exists in <path/filename>"

Bu web sitesindeki araştırmalardan şu komutu kullandım:git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --prune-empty --tag-name-filter cat -- --all

Harika çalıştı ve büyük dosyalar kaldırıldı.

İnanılmaz bir şekilde, itme yine de başka bir hatayla başarısız oldu: error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 fatal: The remote end hung up unexpectedly

Bu doğrudan .git yapılandırma dosyasını değiştirerek düzeltildi - postBuffer = 999999999

Bundan sonra itme geçti!


1
ek bir gotcha (yukarıda olduğu gibi) büyük bir dosyayı kaldırma ile uğraşmak zorunda kaldı klasörlerden birinde hash # karakteri vardı. Bu normal git işlemi için hiçbir soruna neden olmadı, ancak git rmdosya için tam havuz yolu adını vermek ve çalışmak için # ters eğik çizgi ile kaçmak gerekiyordu
jacanterbury

bu da benim için çalıştı. Ben kaçınılması reset hardbasit bir itme ile sayfanın alt kısmında adımını. czettner.com/2015/07/16/…
Monte Hayward

Bu da 'git push -f origin' çalıştırdıktan sonra çalıştı
kezzos

12

GitHub, büyük dosyayı sildikten sonra bile repo'mu neden reddediyor?

Git, projenizin tüm geçmişini saklar, bu nedenle projenizden bir dosyayı 'silseniz bile, Git deposunun geçmişinde dosyanın bir kopyası vardır ve başka bir depoya (örneğin, GitHub) sonra Git için uzaktan repo yerel repo ile aynı geçmişe sahip olmasını gerektirir (yani geçmişindeki aynı büyük dosyalar).

GitHub'ın repo'mu kabul etmesini nasıl sağlayabilirim?

Projenizin Git geçmişini yerel olarak temizlemeniz, istenmeyen büyük dosyaları tüm geçmişten kaldırmanız ve daha sonra yalnızca 'temizlenmiş' geçmişi kullanmanız gerekir. Etkilenen taahhütlerin Git taahhüt kimlikleri değişecektir.

Git depomdaki büyük dosyaları nasıl temizlerim?

Git geçmişinden istenmeyen büyük dosyaları temizlemek için en iyi araç BFG Repo-Cleaner'tır - git-filter-branchözellikle Git geçmişinden istenmeyen dosyaları kaldırmak için tasarlanmış daha basit ve daha hızlı bir alternatiftir .

Kullanım talimatlarını dikkatlice takip edin , çekirdek kısım sadece bu:

$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git

100 MB'tan büyük dosyalar ( en son taahhüdünüzde bulunmayan) Git deponuzun geçmişinden kaldırılır. Daha sonra git gcölü verileri temizlemek için kullanabilirsiniz :

$ git gc --prune=now --aggressive

BFG genellikle koşmaktan en az 10-50x daha hızlıdır git-filter-branchve genellikle kullanımı çok daha kolaydır.

Tam açıklama: BFG Repo-Cleaner'ın yazarıyım.


1
Benim durumumda ezmeyi engelleyen ek komplikasyonlar vardı. BFG aracı harika çalıştı. Teşekkürler.
dantopa

Bu olağanüstü bir çözüm
SexualPotatoes

5

Yukarıdaki yöntemleri denedim ama hiçbiri benim için çalışmıyor.

Sonra kendi çözümümü buldum.

  1. Her şeyden önce, temiz ve güncel bir yerel repoya ihtiyacınız var. Lanet olası tüm büyük dosyaları silin.

  2. Şimdi repo klasörünüzün DIŞINDA yeni bir klasör oluşturun ve yeni bir Git havuzu yapmak için "Git burada depo oluştur" u kullanın, buna new_local_repo diyelim. Budur! Yukarıdaki tüm yöntemler tarihi temizlemeniz gerektiğini söyledi ..., bundan bıktım, tarihsiz yeni bir repo yaratalım!

  3. Eski, berbat yerel repo dosyalarınızı yeni, güzel repo kopyalayın. Klasör simgesindeki yeşil logonun kaybolacağını unutmayın, bu umut verici çünkü bu yeni bir repo!

  4. Yerel şubeye bağlanın ve ardından uzak yeni şubeye geçin. Buna new_remote_branch diyelim. Yeni bir yerel depodan nasıl aktarılacağını bilmiyorsanız Google'ı kullanın.

  5. Tebrikler! Temiz, güncel kodunuzu GitHub'a aktardınız. Artık uzak ana şubeye ihtiyacınız yoksa new_remote_branch'ınızı yeni ana şube olarak yapabilirsiniz. Nasıl yapacağınızı bilmiyorsanız Google'a gönderin.

  6. Son adım, berbat eski yerel repoyu silme zamanı. Gelecekte yalnızca new_local_repo kullanacaksınız.


4

Aynı problemi yaşadım ve cevapların hiçbiri işe yaramadı. Aşağıdaki adımlarla çözdüm:

1. Hangi dosyayı büyük dosyaların içerdiğini bulun

git log --all -- 'large_file`

Alt taahhüt en eskisidir sonuç listesindeki işlemdir.

2. En eskisinden hemen önce bulun.

git log

Varsayalım:

commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

3. Git rebase

git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

İpuçları :

  1. Liste öğesi
  2. Ben sadece droptaahhütleri büyük dosyayı içeren seçin .
  3. Rebase bunları gidermek ve kullanmak sırasında çatışmalarla karşılaşabilirsiniz git rebase --continue bitirene kadar devam edebilirsiniz.
  4. Rebase sırasında bir şeyler ters giderse git rebase --abortiptal etmek için kullanın .


1

Büyük dosyaları / klasörleri çalışma klasörü içinde tutmanın çözümü

Burada sorulan sorunu çözmek için çalışan hat (cevap 1'den):

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

Bu komut, dosya / dir çalışma ağacındaysa, / dir dosyasını da siler.

Dosya / klasörü çalışma ağacında tutmak istiyorsanız, aşağıdaki adımları izlemenizi öneririm.

  1. Bu hata çalıştırıldıktan sonra git reset HEAD^
  2. Söz konusu dosyayı / klasörü `` .gitignore`` dosyasına ekleyin.

  3. git add .Diğer dosyaları / klasörleri yakalayabilen ancak .gitignoredosyayı yakalaması gereken her zamanki gibi devam edin . Sıradaki git commit -m"message"ve son olarakgit push origin <branch_name>


0

bu benim için çalıştı. github Squashing Git belgelerinden Git taahhütler git reset origin / master

git checkout master && git pull;
git merge feature_branch;
git add . --all;
git commit -m "your commit message"

belgeleri burada bulabilirsiniz


0

İlk cevaba ekliyorum.

git filter-branch --dizin-filter 'git rm -r --cached --ignore-unmatch' KAFA

Menşe / üstattan birleşme çatışması olacaktır.

Şubeniz ve 'başlangıç ​​noktanız / ustanız' birbirinden ayrılmıştır ve her biri sırasıyla 114 ve 109 farklı komisyona sahiptir. (uzak dalı sizinkine birleştirmek için "git pull" kullanın)

Lütfen bunu çalıştırın

git reset --hard başlangıç ​​/ master

Tüm aşamalı ve değişmemiş değişikliklerimi atar, mevcut yerel şubemdeki her şeyi unutur ve başlangıç ​​/ master ile tam olarak aynı yapar.


0

Bu yüzden belirli bir durumla karşılaştım: gitlab'den 100 mb'den daha büyük bir dosya içeren ancak git geçmişinin bir noktasında kaldırılan bir havuzu klonladım. Daha sonra yeni bir github özel repo eklediğimde ve yeni repoya zorlamaya çalıştığımda, rezil 'dosya çok büyük' ​​hatası aldım. Bu noktada, artık orijinal gitlab repo'suna erişimim yoktu. Ancak, yine bfg-repo-cleanerde makinemdeki bir LOCAL deposunu kullanarak yeni özel github reposunu itebildim :

$ cd ~
$ curl https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/bfg-1.13.0.jar > bfg.jar
$ cd my-project
$ git gc
$ cd ../
$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-project
$ cd my-project
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git remote -v # confirm origin is the remote you want to push to
$ git push origin master

0

Bazen dosya izleme geçmişinde tutulur, aşağıdaki adımları deneyin:

  1. git commit, Listelenen büyük dosya ile oluşturma modu görüyorsanız, şunları yapın :
  2. git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD. Konsolunuzda aşağıdakilerle biten bir sürü Rewrites görmelisiniz:

    rm 'dosyaadı' ve

    Son satır Ref yeniden yazıldı.

Bitti.

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.