Ş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.

460
13 марта '12 в 14:41 2012-03-13 14:41 kaese , 13 Mart '12'de , saat 14:41 de ayarlandı 2012-03-13 14:41
@ 14 cevaplar

İş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 
747
13 марта '12 в 14:44 2012-03-13 14:44 Cevap Fred Foo tarafından 13 '12 Mart tarihinde saat 14: 44'te verilmiştir 2012-03-13 14:44

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 
border=0

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).

410
27 окт. 27 Ekim’de Zeelot’a verilen cevap . 2012-10-27 21:16 '12 21:16 2012-10-27 21:16

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.

63
22 марта '13 в 16:53 2013-03-22 16:53 Cevap dan_waterworth 22 '13 Mart tarihinde 16:53 tarihinde yayınlandı 2013-03-22 16:53

Ç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.

26
14 марта '12 в 23:24 2012-03-14 23:24 Cevap Carl tarafından 14 '12 Mart'ta 23:24 de verilmiştir 2012-03-14 23:24

.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!

21
14 окт. Cevap Shivam Srivastava tarafından 14 Ekim'de verildi . 2017-10-14 12:08 '17, 12:08 2017-10-14 12:08

Ö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 
14
19 апр. tarafından verilen cevap 19 Nis tarihinde lalebarde 2014-04-19 11:58 '14, 11:58 2014-04-19 11:58

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 
5
12 марта '17 в 17:53 2017-03-12 17:53 Cevap pratik_bhavsar 12 Mart '17' de 17:53 2017-03-12 17:53 tarihinde verilmiştir.

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/

5
04 апр. Cevap Matthias M 04 tarafından verildi . 2016-04-04 14:05 '16, 14:05, 2016-04-04 14:05

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

2
06 февр. Cevap Sam Watkins tarafından 06 Şubat'ta verildi . 2013-02-06 19:46 '13, 19:46 2013-02-06 19:46
 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.

1
05 апр. Cevap jthill 05 nisan verildi 2014-04-05 04:42 '14, 04:42 2014-04-05 04:42

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.

0
04 апр. Cevap AnoE 04 tarafından verildi . 2016-04-04 14:27 '16, 2:27 PM 2016-04-04 14:27

Bunu yapmak için Sığ Klon git git clone --depth 1 URL komutunu kullanın - yalnızca geçerli HEAD deposunu klonlar

-1
23 авг. Cevap kkarki 23 ağustos tarafından verildi . 2017-08-23 18:55 '17 18: 55'te 2017-08-23 18:55

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.

Daha fazla bilgi burada.

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 
-1
05 июня '13 в 8:41 2013-06-05 08:41 Cevap, 05.06.013 , 08:41 de 08:41

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.

-1
11 апр. Yanıtlayan , Nis 11 tarihinde JB Lovell tarafından verildi. 2017-04-11 21:54 '17, 21:54, 2017-04-11 21:54

tags ya da Soru Sor ile ilgili diğer sorular