Mövcud törətməni keçid deposunda bir (ilkin) törətməyi edin?

Hal-hazırda yerli bir Git deposu var və Github deposunu tıklayacağam.

Yerli deposu ~ 10 işə malikdir və Github deposu bunun bir sinxronizasiya edilmiş dublikatıdır.

Mən nə etmək istərdimsə, yerli Git deposundan BÜTÜN versiya tarixini silin, dolayısı ilə, mövcud depo məzmunu yalnız əmr (və dolayısı ilə, köşedeki faylların köhnə versiyaları saxlanmır) kimi göstərilir,

Github'ta bu dəyişiklikləri klikləməyim istərdim.

Git rebase'yi araşdırdım, ancaq bu, müəyyən versiyaları aradan qaldırmaq üçün daha uyğun görünür. Digər bir potensial həll yerli reponu aradan qaldırmaq və yenisini yaratmaqdır, baxmayaraq ki, bu, çox iş yaratacaqdır!

ETA: İzlənməyən müəyyən kataloqlar / fayllar var - mümkünsə, bu faylları aradan qaldırmaq üçün dəstək istərdim.

460
13 марта '12 в 14:41 2012-03-13 14:41 13 mart 2012-ci il tarixdə saat 12:
@ 14 cavab

Burada güclü bir qüvvə yanaşmasıdır. Həm də depo konfiqurasiyasını qaldırır.

Qeyd Depodaki alt modul varsa, bu işə yaramır! Submodulları istifadə etsəniz, məsələn, interaktiv bir reboot istifadə etməlisiniz .

Adım 1: bütün tarixi silin ( Zəngin olduğunuza əmin olun, geri qayıtmaq mümkün deyil )

 rm -rf .git 

Addım 2: Git deposunu yalnız mövcud məzmunla bərpa edin

 git init git add . git commit -m "Initial commit" 

Addım 3: GitHub üzərinə basın.

 git remote add origin <github-uri> git push -u --force origin master 
747
13 марта '12 в 14:44 2012-03-13 14:44 Cavab Fred Foo tərəfindən 13 Mart 2012, saat 14:44 'da veriləcək. 2012-03-13 14:44

Mənim üçün işləyən yeganə həll (və alt modulların işi)

 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

.git/ alt modulları olduğunda həmişə böyük problemlər yaradır. git rebase --root istifadə - mənim üçün münaqişələr git rebase --root səbəb git rebase --root (və mənim git rebase --root ).

410
27 окт. Cavab 27 oktyabrda Zeelot'a verildi . 2012-10-27 21:16 '12 at 21:16 2012-10-27 21:16

Bu mənim əlverişli yanaşmadır:

 git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree}) 

Bu, bir işə yarayan yeni bir şöbə yaradır və bu da HEAD-a hər şeyi əlavə edəcək. Bir şey dəyişmir, buna görə tamamilə təhlükəsizdir.

63
22 марта '13 в 16:53 2013-03-22 16:53 cavab 22 mart 'dan 16: 30'a qədər dan_waterworth verilir 2013-03-22 16:53

Bir çox əməl varsa, bir çox iş ola biləcək başqa bir seçim interaktiv rebaza (əgər git versiyası 1.7.12): git rebase --root -i

Redaktorunuzda əməllərin siyahısını təqdim edərkən:

  • İlk tövsiyə üçün "reword" ə "dəyişikliyi" dəyişdirin
  • Hər bir digər tövsiyəni "düzəltmək" üçün "seçməyi" dəyişdirin

Saxla və bağla. git yenidən başlayacaq.

Sonda sizdən sonra gələnlərin hamısının birləşməsi olan yeni kök saxlayıcınız olacaq.

Üstünlüklərdən ibarətdir ki, sənin deposunu silmək lazım deyil və başqa düşüncələriniz varsa, həmişə ehtiyatınız var.

Həqiqətən tarixinizi məhv etmək istəyirsənsə, bu tövsiyə üçün ustunu sıfırlayın və bütün digər şöbələri silin.

26
14 марта '12 в 23:24 2012-03-14 23:24 Cavab Carl tərəfindən 14 Mart 2012 tarixində saat 23: 24-də verilir. 2012-03-14 23:24

.Git qovluğunun silinməsi git qovluğunda problem yarada bilər. Bütün fiksasyon tarixinizi silmək istəsəniz.

bu addımları edin:

addım-1 (ödəmə)

 git checkout --orphan latest_branch 

addım-2 (bütün faylları əlavə edin)

 git add -A 

Addım 3 (dəyişiklikləri qəbul et)

 git commit -am "commit message" 

addım-4 (filialı sil)

 git branch -D master 

addım-5 (master filialın adını dəyişin)

 git branch -m master 

Adım 6 (son addım, depounuzu yeniləmək üçün güc)

 git push -f origin master 

!! İndi fiksasiya tarixindən zövq alın!

21
14 окт. cavab 14 oktyabrda Şivam Srivastava tərəfindən verilir . 2017-10-14 12:08 '17 at 12:08 2017-10-14 12:08

Təklif olunan larsmans metodunun variantları:

Qeyri-çap fayllarının siyahısını saxla:

 git ls-files --others --exclude-standard > /tmp/my_untracked_files 

Git konfiqurasiyasını qeyd edin:

 mv .git/config /tmp/ 

Sonra larsmans ilk addımlar:

 rm -rf .git git init git add . 

Konfiquranı bərpa edin:

 mv /tmp/config .git/ 

Sınaqsız faylları silin:

 cat /tmp/my_untracked_files | xargs -0 git rm --cached 

Sonra düzeltin:

 git commit -m "Initial commit" 

Nəhayət, depounuza vurun:

 git push -u --force origin master 
14
19 апр. 19 aprel tarixində lalebarde tərəfindən verilmiş cavab 2014-04-19 11:58 '14 at 11:58 2014-04-19 11:58

Şəffaflıq yaratmaq, bütün məzmunu kopyalayın, kopyalayın və əsas şəffaflığı 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 Cavab pratik_bhavsar verilir 12 Mart '17 və 17:53 2017-03-12 17:53

Səviyyəli klonlardan istifadə edə bilərsiniz (git> 1.9):

 git clone --depth depth remote-url 

Əlavə məlumat: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

5
04 апр. cavab Matthias M 04 apr tərəfindən verilir . 2016-04-04 14:05 '16 saat 02:05 'da 2016-04-04 14:05

Aşağıdakı üsul reproducible, belə ki, hər iki tərəf uyğun olduqda, klon yenidən başlamaq üçün ehtiyac yoxdur, yalnız script digər tərəfdən run.

 git log -n1 --format=%H >.git/info/grafts git filter-branch -f rm .git/info/grafts 

Bunu təmizləmək istəyirsinizsə, skripti sınayın:

http://sam.nipl.net/b/git-gc-all-ferocious

Depoda hər bir şöbə üçün "tarixini öldürür" deyə bir yazı yazdım:

http://sam.nipl.net/b/git-kill-history

Həmçinin bax: http://sam.nipl.net/b/confirm

2
06 февр. Cavab 06 fevralda Sam Watkins tərəfindən verildi . 2013-02-06 19:46 '13 saat 19:46 'da 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, bütün yerli şöbələri və etiketləri silmək, cari denetiminizin statusu ilə tarixi olmayan bir hadisə etməkdir və hər hansı bir şeyi repo qaydalarına salmır. Sonra istədiyiniz kimi uzaqdan qüvvətlə basın bilər.

1
05 апр. cavab jthill verilir 05 Apr 2014-04-05 04:42 '14 at 4:42 2014-04-05 04:42

Mən nə etmək istərdimsə, yerli Git deposundan BÜTÜN versiya tarixini silin, dolayısı ilə, mövcud depo məzmunu yalnız əmr (və dolayısı ilə, köşedeki faylların köhnə versiyaları saxlanmır) kimi göstərilir,

Daha konkret cavab:

etiket avtomatik olaraq zibil yığır, əgər tags / filiallar / bağlantılar onları göstərmirsə. Beləliklə, bütün etiketləri / şöbələri aradan qaldırmaq və filialla əlaqəli yeni bir yetim tapşırığı yaratmaq lazımdır - razılığa əsasən, bu şöbənin bu öhdəliyi göstərməsinə imkan verəcəkdir.

Köhnə, əlçatmaz əməlləri, aşağı səviyyəli Git əmrlərinə daxil etməyincə, heç kim tərəfindən heç vaxt heç bir zaman görülə bilməz. Bu sizin üçün kifayətdirsə, mən orada dayanacağam və istənilən zaman avtomatik GC-ni edəcəyəm. Onları dərhal qurtarmaq istəsəniz, git gc --aggressive --prune=all (bəlkə də, --aggressive --prune=all ) istifadə edə bilərsiniz. Uzaq bir Git deposu üçün, fayl sisteminə daxil olmadıkça bunu edə bilməyəcəksiniz.

0
04 апр. Cavab AnoE 04 apr tərəfindən verilir . 2016-04-04 14:27 '16 at 2:27 PM 2016-04-04 14:27

Bunu etmək üçün, Səviyyəli Clone git clone komandasını istifadə edin - dərhal 1 URL - yalnız mövcud HEAD deposunu klonlayacaq

-1
23 авг. Cavab kkarki 23 avqustda verilir . 2017-08-23 18:55 '17 saat 18:55 'da 2017-08-23 18:55

Gitdən sonuncu törətməni aradan qaldırmaq üçün yalnız qaça bilərsiniz

 git reset --hard HEAD^ 

Yuxarıdakı bir neçə öhdəliyi silsəniz, qaça bilərsiniz

 git reset --hard HEAD~2 

son iki əmri aradan qaldırmaq. Daha çox əməlləri aradan qaldırmaq üçün sayını artıra bilərsiniz.

Daha çox məlumat burada.

Got tutoturial burada depo təmizlənməsi ilə yardım edir:

Dosyayı tarixdən silmək və onu təsadüfən təkrarlamadığını təmin etmək üçün .gitignore əlavə etmək istəyirsiz. Bizim nümunələrimiz üçün Rakefile'yi github gem deposundan çıxaracağıq.

 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 

Artıq faylın tarixdən silinməsinə baxmayaraq, biz bunu qəza etməyimizə zəmanət verək.

 echo "Rakefile" >> .gitignore git add .gitignore git commit -m "Add Rakefile to .gitignore" 

Deponun vəziyyətindən razısınızsa, dəyişiklikləri uzaq depo üzərində yazmaq üçün məcbur etmək lazımdır.

 git push origin master --force 
-1
05 июня '13 в 8:41 2013-06-05 08:41 cavab 05 avqust 2013 - il saat 8: 41-də verilir

Mənim .git qovluğunu qaldırmaq və IntelliJ vasitəsilə versiya nəzarətinə yenidən daxil .git oxşar bir problemi həll etdim. Qeyd .git qovluğu gizlidir. Terminalda ls -a ilə baxa bilərsiniz və sonra rm -rf .git ilə silin.

-1
11 апр. Apr 11-də JB Lovell tərəfindən verilmiş cavab 2017-04-11 21:54 '17 saat 9:54 'da 2017-04-11 21:54