Şu anki işlemeyi git havuzunda tek (ilk) bir işlem haline getirme?
Şu anda, Github deposuna tıkladığım yerel bir Git deposuna sahibim.
Yerel veri havuzunun ~ 10 taahhüdü vardır ve Github veri havuzu bunun senkronize bir kopyasıdır.
Yapmak istediğim, TÜM sürüm geçmişini yerel Git deposundan kaldırmak, böylece geçerli depo içeriği tek bir işlem olarak görüntülenecek (ve bu nedenle depodaki dosyaların eski sürümleri kaydedilmiyor),
Bu değişiklikleri Github'da tıklamak istiyorum.
Git rebase'i araştırdım, ancak bu belirli sürümleri kaldırmak için daha uygun görünüyor. Başka bir potansiyel çözüm, yerel repoyu kaldırmak ve yeni bir tane oluşturmaktır, ancak bu muhtemelen çok fazla iş yaratacaktır!
ETA: İzlenmeyen bazı dizinler / dosyalar var - mümkünse, bu dosyaların devre dışı bırakılmasını desteklemek istiyorum.
İşte kaba kuvvet yaklaşımı. Ayrıca depo yapılandırmasını da kaldırır.
Not. Depoda alt modüller varsa bu işe yaramaz! Alt modüller kullanıyorsanız, örneğin etkileşimli bir yeniden başlatma kullanmalısınız.
1. Adım: tüm geçmişi silin ( Bir yedeğiniz olduğundan emin olun, geri dönmek mümkün değildir )
rm -rf .git
Adım 2: Git deposunu yalnızca geçerli içerikle geri yükle
git init git add . git commit -m "Initial commit"
Adım 3: GitHub'a tıklayın.
git remote add origin <github-uri> git push -u --force origin master
Benim için çalışan tek çözüm (ve alt modül çalışmaları)
git checkout --orphan newBranch git add -A # Add all files and commit them git commit git branch -D master # Deletes the master branch git branch -m master # Rename the current branch to master git push -f origin master # Force push master branch to github git gc --aggressive --prune=all # remove the old files

Alt modüllere .git/
kaldırılması her zaman büyük sorunlara neden olur. git rebase --root
kullanmak bir şekilde benim için çatışmalara neden olur (ve çok fazla geçmişim var).
Bu benim olumlu yaklaşımım:
git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})
Bu, HEAD'e her şeyi katacak tek bir taahhütle yeni bir şube yaratacaktır. Hiçbir şeyi değiştirmez, bu yüzden tamamen güvenlidir.
Çok fazla taahhüdünüz varsa çok fazla iş çıkaran bir başka seçenek de interaktif bir rebase (git sürümünüz> 1.7.12 ise): git rebase --root -i
Editörünüzde bir taahhüt listesi sunarken:
- İlk taahhüt için "seçim" i "yeniden" olarak değiştir
- Diğer tüm taahhütleri "düzelt" olarak "seç" olarak değiştirin
Kaydet ve kapat. Git yeniden başlatılacak.
Sonunda, ondan sonra gelenlerin bir birleşimi olan yeni bir kök hizmetçiniz olacak.
Bunun avantajı, havuzunuzu silmenize gerek kalmaması ve başka düşünceleriniz varsa, her zaman bir rezerviniz vardır.
Geçmişinizi gerçekten yok etmek istiyorsanız, bu işlem için master'ı sıfırlayın ve diğer tüm dalları silin.
.Git klasörünü silmek git deposunda sorunlara yol açabilir. Fiksasyon geçmişinizin tamamını silmek istiyorsanız.
şu adımları izleyin:
1. adım (ödeme)
git checkout --orphan latest_branch
2. Adım (tüm dosyaları ekleyin)
git add -A
Adım 3 (Değişiklikleri Tamamla)
git commit -am "commit message"
4. adım (Şubeyi sil)
git branch -D master
5. adım (geçerli dalı master olarak yeniden adlandırın)
git branch -m master
6. Adım (son adım, havuzunuzu güncelleme gücü)
git push -f origin master
!! Şimdi fiksasyon tarihinin tadını çıkarın!
Önerilen larsmans yönteminin bir çeşidi:
Yazdırılmayan dosyaların listesini kaydedin:
git ls-files --others --exclude-standard > /tmp/my_untracked_files
Git yapılandırmasını kaydedin:
mv .git/config /tmp/
O zaman larsmanların ilk adımlarını izleyin:
rm -rf .git git init git add .
Yapılandırmayı geri yükle:
mv /tmp/config .git/
Test edilmemiş dosyaları atın:
cat /tmp/my_untracked_files | xargs -0 git rm --cached
Ardından düzeltin:
git commit -m "Initial commit"
Son olarak, depoya tıklayın:
git push -u --force origin master
Bir dal oluşturun, tüm içeriği kopyalayın, kopyalayın ve sonra ana dalı silin:
git checkout --orphan newBranch; git add -A ;git commit -am 'first commit' ;git branch -D master;git branch -m master; git push -f origin master; git gc --aggressive --prune=all
Sığ klonları kullanabilirsiniz (git> 1.9):
git clone --depth depth remote-url
Daha fazla okuma: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/
Aşağıdaki yöntem yeniden üretilebilir, bu nedenle klonun her iki tarafının da tutarlı olması durumunda klonu yeniden başlatmaya gerek kalmaz, sadece komut dosyasını diğer tarafta çalıştırın.
git log -n1 --format=%H >.git/info/grafts git filter-branch -f rm .git/info/grafts
Temizlemek istiyorsanız, betiği deneyin:
http://sam.nipl.net/b/git-gc-all-ferocious
Depodaki her dal için "geçmişi öldüren" bir senaryo yazdım:
http://sam.nipl.net/b/git-kill-history
Ayrıca bakınız: http://sam.nipl.net/b/confirm
git for-each-ref --format='git update-ref -d %(refname)' \ refs/{heads,tags} | sh -x current=$(git commit-tree -m 'Initial commit' `git write-tree`) git update-ref -m 'Initial commit' `git symbolic-ref HEAD` $current
Bu, tüm yerel dalları ve etiketleri kaldıracak, geçmişi geçerli olanın herhangi bir dalında geçerli çekinizin durumuyla geçmişsiz bir etkinlik yapacak ve reponuzdaki diğer her şeyi bozulmadan bırakacaktır. Daha sonra, istediğiniz gibi uzaktan kumandalarınızı zorla tıklayabilirsiniz.
Yapmak istediğim, TÜM sürüm geçmişini yerel Git deposundan kaldırmak, böylece geçerli depo içeriği tek bir işlem olarak görüntülenecek (ve bu nedenle depodaki dosyaların eski sürümleri kaydedilmiyor),
Daha fazla kavramsal cevap:
git, otomatik olarak çöp, etiketler / branşlar / linkler onlara işaret etmediğinde eski taahhütleri toplar. Bu nedenle, tüm etiketleri / dalları kaldırmanız ve bir şubeyle ilişkilendirilmiş yeni bir yetim anlaşması oluşturmanız yeterlidir - anlaşma yaparak, master
şubenin bu taahhüdü belirtmesine izin vereceksiniz.
Eski, erişilemez komisyonlar, düşük seviye Git komutlarına girmedikleri sürece bir daha kimse tarafından görülmeyecek. Bu sizin için yeterliyse, orada durup otomatik GC'nin istediği zaman yapmasına izin vereceğim. Onlardan hemen kurtulmak istiyorsanız git gc
kullanabilirsiniz (belki - - --aggressive --prune=all
). Uzak bir Git deposu için, dosya sistemine erişiminiz olmadıkça bunu yapamazsınız.
Git son işlemeyi kaldırmak için koşabilirsiniz
git reset --hard HEAD^
Yukarıdan birkaç taahhüt silerseniz,
git reset --hard HEAD~2
son iki komisyonu çıkarmak. Daha fazla taahhüt çıkarmak için numarayı artırabilirsiniz.
Git tutoturial burada depoyu temizlemek için yardım sağlar:
Yanlışlıkla tekrarlanmamasını sağlamak için dosyayı tarihçeden silmek ve .gitignore dosyasına eklemek istiyorsunuz. Örneklerimiz için, Rakefile'i github gem deposundan çıkaracağız.
git clone https://github.com/defunkt/github-gem.git cd github-gem git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch Rakefile' \ --prune-empty --tag-name-filter cat -- --all
Şimdi, dosyayı geçmişten silmiş olduktan sonra, yanlışlıkla yapmadığımızı garanti edelim.
echo "Rakefile" >> .gitignore git add .gitignore git commit -m "Add Rakefile to .gitignore"
Deponun durumundan memnunsanız, değişiklikleri uzak havuzun üzerine yazmaya zorlamanız gerekir.
git push origin master --force
Benzer bir sorunu .git
klasörünü kaldırarak ve IntelliJ aracılığıyla sürüm kontrolü ile yeniden birleştirerek .git
. Not. .git
klasörü gizlidir. Terminalde ls -a
ile görüntüleyebilir ve sonra rm -rf .git
ile silebilirsiniz.
Git git-commit github tags ya da Soru Sor ile ilgili diğer sorular