Padarykite dabartinę užduotį vieno (pradinio) įsipareigojimo git repozitoriume?

Šiuo metu turiu vietinę „Git“ saugyklą, kurią spusteliu „Github“ saugykloje.

Vietinė saugykla turi apie 10 įvykių, o „Github“ saugykla - tai sinchronizuotas šio dublikato kopija.

Ką norėčiau padaryti, pašalinkite VISĄ versijos istoriją iš vietinio „Git“ saugyklos, todėl dabartinis saugyklos turinys bus rodomas kaip vienintelis įsipareigojimas (todėl senesnės duomenų saugyklos versijos nėra išsaugotos),

Norėčiau spustelėti šiuos pakeitimus Githube.

Ištyriau „Git“ grįžtamąjį ryšį, bet tai atrodo labiau tinka tam tikroms versijoms pašalinti. Kitas galimas sprendimas - pašalinti vietinę repo ir sukurti naują, nors tai greičiausiai sukurtų daug darbo!

ETA: Yra tam tikrų katalogų / failų, kurie nėra stebimi - jei įmanoma, norėčiau palaikyti šių failų išjungimą.

460
13 марта '12 в 14:41 2012-03-13 14:41 kaese yra nustatytas kovo 13 d ., 12 val. 2:41 PM 2012-03-13 14:41
@ 14 atsakymų

Čia yra brutalaus jėgos metodas. Jis taip pat pašalina kapinyno konfigūraciją.

Pastaba Tai neveikia, jei kapinyne yra submodulių! Jei naudojate submodulius, turėtumėte naudoti, pavyzdžiui, interaktyvų perkėlimą.

1 veiksmas: ištrinkite visą istoriją ( įsitikinkite, kad turite atsarginę kopiją, neįmanoma grąžinti )

 rm -rf .git 

2 veiksmas: atkurkite „Git“ saugyklą tik turiniu

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

3 veiksmas: spustelėkite „GitHub“.

 git remote add origin <github-uri> git push -u --force origin master 
747
13 марта '12 в 14:44 2012-03-13 14:44 Atsakymą pateikė Fredas Foo kovo 13 d. 12 val. 2012-03-13 14:44

Vienintelis sprendimas, kuris veikia man (ir submoduliams), yra

 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

Pašalinus .git/ visada kyla didelių problemų, kai turiu submodulius. Naudojant git rebase --root kažkaip sukels man konfliktus (ir turiu daug istorijos).

410
27 окт. atsakymas į Zeelot spalio 27 d. 2012-10-27 21:16 '12 21:16 2012-10-27 21:16

Tai yra mano palankus požiūris:

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

Tai sukurs naują filialą su vienu įvykiu, kuris viską pridės prie HEAD. Jis nieko nekeičia, todėl jis yra visiškai saugus.

63
22 марта '13 в 16:53 2013-03-22 16:53 atsakymas dan_waterworth pateikiamas kovo 13 d. 13 val. 16:53 2013-03-22 16:53

Kitas variantas, kuris gali būti daug darbo, jei turite daug įsipareigojimų, yra interaktyvus atnaujinimas (jei jūsų git versija yra> 1.7.12): „ git rebase --root -i

Pateikdami redaktoriaus įsipareigojimų sąrašą:

  • Pakeiskite „pasiimti“ į „perskaičiuoti“ pirmuosius įvykius
  • Pakeiskite „pick“ į „fixup“ kiekvieną kitą įvykį

Išsaugokite ir uždarykite. „git“ bus paleistas iš naujo

Galų gale turėsite naują šaknies laikiklį, kuris yra visų tų, kurie atėjo po jo, derinys.

Privalumas yra tas, kad nereikia ištrinti savo saugyklos, ir jei turite kitų minčių, visada turite rezervą.

Jei tikrai norite sunaikinti savo istoriją, iš naujo nustatykite šį pagrindą ir ištrinkite visus kitus filialus.

26
14 марта '12 в 23:24 2012-03-14 23:24 atsakymą davė Carl kovo 14 d. 12 val. 23:24 2012-03-14 23:24

Ištrinant .git aplanką gali kilti problemų git saugykloje. Jei norite ištrinti visą įrašo istoriją.

atlikite šiuos veiksmus:

1 žingsnis (apmokėjimas)

 git checkout --orphan latest_branch 

2 žingsnis (pridėkite visus failus)

 git add -A 

3 veiksmas (padaryti pakeitimus)

 git commit -am "commit message" 

4 žingsnis (trinti šaką)

 git branch -D master 

5-as žingsnis (pervardyti dabartinį filialą, kad jis būtų pagrindinis)

 git branch -m master 

6 veiksmas (galutinis žingsnis, galia atnaujinti saugyklą)

 git push -f origin master 

!! Dabar mėgaukitės fiksacijos istorija!

21
14 окт. atsakymą Shivam Srivastava pateikė spalio 14 d. 2017-10-14 12:08 '17 at 12:08 2017-10-14 12:08

Siūlomo larsmano metodo variantas:

Išsaugokite nespausdinamų failų sąrašą:

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

Išsaugokite „git“ konfigūraciją:

 mv .git/config /tmp/ 

Tada atlikite pirmuosius „larsmans“ veiksmus:

 rm -rf .git git init git add . 

Atkurti konfigūraciją:

 mv /tmp/config .git/ 

Išmesti nepažeistus failus:

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

Tada pataisykite:

 git commit -m "Initial commit" 

Galiausiai spustelėkite savo saugyklą:

 git push -u --force origin master 
14
19 апр. atsakymas, kurį lalebarde pateikė balandžio 19 d 2014-04-19 11:58 '14 at 11:58 2014-04-19 11:58

Sukurkite filialą, nukopijuokite visą turinį į jį, nukopijuokite jį ir ištrinkite pagrindinį filialą:

 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 atsakymas duotas pratik_bhavsar kovo 12 d., 17 val. 17:53 2017-03-12 17:53

Galite naudoti seklius klonus (git> 1.9):

 git clone --depth depth remote-url 

Daugiau informacijos: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

5
04 апр. atsakymą pateikė Matthias M 04 balandžio. 2016-04-04 14:05 '16 at 14:05 2016-04-04 14:05

Toliau pateikiamas metodas atkuriamas, todėl nereikia vėl pradėti klono, jei abi pusės yra nuoseklios, tiesiog paleiskite scenarijų kitoje pusėje.

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

Jei norite jį išvalyti, pabandykite scenarijų:

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

Parašiau scenarijų, kuris „žudo istoriją“ kiekvienam saugyklos filialui:

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

Taip pat žiūrėkite: http://sam.nipl.net/b/confirm

2
06 февр. Atsakymą pateikė Sam Watkins 06 vasario mėn. 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 

Tai pašalins visus vietinius filialus ir žymes, padarys vieną įvykį be istorijos su jūsų dabartinio čekio būsena bet kuriame dabartinio filialo skyriuje ir paliks visą kitą savo repo. Tada galite spustelėti savo nuotolinio valdymo pultus, kaip norite.

1
05 апр. atsakymas pateikiamas liepos 5 d 2014-04-05 04:42 '14, 4:42 2014-04-05 04:42

Ką norėčiau padaryti, pašalinkite VISĄ versijos istoriją iš vietinio „Git“ saugyklos, todėl dabartinis saugyklos turinys bus rodomas kaip vienintelis įsipareigojimas (todėl senesnės duomenų saugyklos versijos nėra išsaugotos),

Daugiau konceptualaus atsakymo:

„git“ automatiškai šiukšlės renka senus įsipareigojimus, jei žymenys / šakos / nuorodos jiems nenurodo. Taigi, jums reikia tiesiog pašalinti visas žymes / filialus ir sukurti naują našlaičio įsipareigojimą, susijusį su filialu - pagal susitarimą leisite, kad master filialas tai padarytų.

Senieji, nepasiekiami įsipareigojimai niekada niekada nebus matomi, nebent jie įsiskverbtų į žemo lygio „Git“ komandas. Jei jums to pakanka, aš tiesiog sustosiu ir leiskite automatiniam GC tai padaryti, kai tik nori. Jei norite iš karto juos atsikratyti, galite naudoti git gc (galbūt su --aggressive --prune=all ). Nuotolinio „Git“ saugyklos atveju tai negalėsite atlikti, nebent turite prieigą prie failų sistemos.

0
04 апр. atsakymą pateikė AnoE 04 balandžio. 2016-04-04 14:27 '16 at 14:27 PM 2016-04-04 14:27

Norėdami tai padaryti, naudokite komandą Shallow Clone git klonas - 1-asis URL - jis tik klonuos dabartinę HEAD saugyklą

-1
23 авг. Atsakymą pateikė kkarki 23 rug . 2017-08-23 18:55 '17, 18:55 pm 2017-08-23 18:55

Jei norite pašalinti paskutinį įsipareigojimą iš git, galite tiesiog paleisti

 git reset --hard HEAD^ 

Jei ištrinsite kelis įsipareigojimus iš viršaus, galite paleisti

 git reset --hard HEAD~2 

pašalinti paskutinius du įsipareigojimus. Galite padidinti skaičių, kad pašalintumėte dar daugiau įsipareigojimų.

Daugiau informacijos rasite čia.

Git tutoturial čia padeda padėti išvalyti saugyklą:

Jūs norite ištrinti failą iš istorijos ir pridėti jį prie .gitignore, kad įsitikintumėte, jog jis netyčia kartojamas. Mūsų pavyzdžiams mes pašalinsime „Rakefile“ iš „github gem“ saugyklos.

 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 

Dabar, kai ištrynėme bylą iš istorijos, garantuokime, kad mes to nepadarysime atsitiktinai.

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

Jei esate patenkinti kapinyno būsena, turite priversti pakeitimus perrašyti nuotolinį saugyklą.

 git push origin master --force 
-1
05 июня '13 в 8:41 2013-06-05 08:41 atsakymas duotas atgal birželio 05 d. 13 val. 8:41 2013-06-05 08:41

Panašią problemą išsprendžiau paprasčiausiai pašalindamas .git aplanką iš savo projekto ir vėl .git versijos valdymą per „IntelliJ“. Pastaba .git aplankas yra paslėptas. Jį galite peržiūrėti terminale su „ ls -a , o tada ištrinti jį rm -rf .git .

-1
11 апр. JB Lovell atsakymas, pateiktas balandžio 11 d 2017-04-11 21:54 '17, 9:54 pm 2017-04-11 21:54

Kiti klausimai apie „ žymes arba Užduoti klausimą