Da li trenutna predaja jednu (početnu) obvezu u git repozitoriju?

Trenutno imam lokalni Git repozitorij, koji kliknem na spremište Github.

Lokalno spremište ima ~ 10 urezivanja, a spremište Github je sinkronizirani duplikat ovoga.

Ono što bih želio učiniti je ukloniti SVU povijest inačice iz lokalnog Git repozitorija, tako da će se trenutni sadržaj spremišta prikazati kao jedina naredba (i stoga, starije verzije datoteka u spremištu nisu spremljene),

Želim kliknuti na te promjene u Githubu.

Istražio sam Git rebase, ali čini se da je to prikladnije za uklanjanje određenih verzija. Još jedno potencijalno rješenje je uklanjanje lokalnog repoa i stvaranje novog, iako bi to vjerojatno stvorilo mnogo posla!

ETA: Postoje određene direktorije / datoteke koje se ne prate - ako je moguće, podržavam onemogućavanje tih datoteka.

460
13 марта '12 в 14:41 2012-03-13 14:41 kaese je postavljen 13. ožujka '12 u 14:41 2012-03-13 14:41
@ 14 odgovora

Ovdje je pristup grube sile. Također uklanja konfiguraciju spremišta.

Napomena. Ovo NE radi ako postoje podmoduli u spremištu! Ako koristite podmodule, trebate koristiti, primjerice, interaktivni ponovno podizanje sustava.

Korak 1: izbrišite cijelu povijest ( provjerite imate li sigurnosnu kopiju, nemoguće je vratiti )

 rm -rf .git 

Drugi korak: obnovite Git repozitorij samo trenutnim sadržajem

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

Korak 3: Kliknite na GitHub.

 git remote add origin <github-uri> git push -u --force origin master 
747
13 марта '12 в 14:44 2012-03-13 14:44 Odgovor je dao Fred Foo na Ožujak 13 '12 u 14:44 2012-03-13 14:44

Jedino rješenje koje radi za mene (i rad pod-modula) je

 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

Uklanjanje .git/ uvijek uzrokuje velike probleme kada imam podmodule. Korištenje git rebase --root nekako izazvati konflikte za mene (i imam puno povijesti).

410
27 окт. odgovor dao Zeelot 27. listopada. 2012-10-27 21:16 '12 u 21:16 2012-10-27 21:16

Ovo je moj povoljan pristup:

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

To će stvoriti novu granu s jednom predajom, koja će sve dodati na HEAD. Ne mijenja ništa, pa je potpuno sigurno.

63
22 марта '13 в 16:53 2013-03-22 16:53 odgovor je dan_waterworth 22. ožujka 2013. u 16:53 2013-03-22 16:53

Još jedna mogućnost koja može biti puno posla ako imate mnogo urezivanja je interaktivna rebase (ako je vaša verzija git> 1.7.12): git rebase --root -i

Prilikom prikazivanja popisa urezivanja u uređivaču:

  • Promijenite "pick" u "reword" za prvu predaju
  • Promijenite "pick" da biste "popravili" svaku drugu obvezu

Spremite i zatvorite. git će se ponovno pokrenuti.

Na kraju ćete imati novi korijenski retainer, koji je kombinacija svih onih koji su došli nakon njega.

Prednost je što ne morate brisati spremište, a ako imate drugih misli, uvijek imate rezervu.

Ako doista želite uništiti svoju povijest, resetirajte master za ovu predaju i izbrišite sve ostale grane.

26
14 марта '12 в 23:24 2012-03-14 23:24 odgovor je dao Carl na 14. ožujka '12 u 23:24 2012-03-14 23:24

Brisanje mape .git može dovesti do problema u git repozitoriju. Ako želite izbrisati cijelu povijest fiksiranja.

slijedite ove korake:

korak-1 (naplata)

 git checkout --orphan latest_branch 

korak-2 (dodavanje svih datoteka)

 git add -A 

Korak 3 (Urezivanje izmjena)

 git commit -am "commit message" 

korak-4 (Izbriši granu)

 git branch -D master 

korak-5 (preimenovanje trenutne grane u master)

 git branch -m master 

Korak 6 (završni korak, mogućnost ažuriranja spremišta)

 git push -f origin master 

!! Sada uživajte u povijesti fiksacije!

21
14 окт. odgovor je dao Shivam Srivastava 14. listopada. 2017-10-14 12:08 '17 u 12:08 2017-10-14 12:08

Varijanta predložene metode Larsmans:

Spremanje popisa datoteka koje nisu ispisane:

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

Spremite konfiguraciju git-a:

 mv .git/config /tmp/ 

Zatim slijedite prve korake larsmansa:

 rm -rf .git git init git add . 

Vraćanje konfiguracije:

 mv /tmp/config .git/ 

Odbaci netestirane datoteke:

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

Zatim popravite:

 git commit -m "Initial commit" 

Na kraju kliknite spremište:

 git push -u --force origin master 
14
19 апр. odgovor od lalebarde 19. travnja 2014-04-19 11:58 '14 u 11:58 2014-04-19 11:58

Stvorite granu, kopirajte sav sadržaj u nju, kopirajte je, a zatim izbrišite glavnu granu:

 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 odgovor je dat pratik_bhavsar 12. ožujka '17 u 17:53 2017-03-12 17:53

Možete koristiti plitke klonove (git> 1.9):

 git clone --depth depth remote-url 

Daljnje čitanje: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

5
04 апр. odgovor je dao Matthias M 04 apr. 2016-04-04 14:05 '16 u 14:05 sati 2016-04-04 14:05

Donja metoda je ponovljiva, tako da nema potrebe ponovno pokretati klon, ako su obje strane konzistentne, samo pokrenite skriptu na drugoj strani.

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

Ako ga želite očistiti, isprobajte skriptu:

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

Napisao sam skriptu koja "ubija povijest" za svaku granu u spremištu:

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

Pogledajte i: http://sam.nipl.net/b/confirm

2
06 февр. Odgovor je dao Sam Watkins 06. veljače. 2013-02-06 19:46 '13 u 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 

Ovo će ukloniti sve lokalne grane i oznake, napraviti jedan događaj bez povijesti s statusom vaše trenutne provjere u bilo kojoj grani trenutne i ostaviti sve ostalo u vašem repo netaknutom. Tada možete prisilno kliknuti na daljinske upravljače kako želite.

1
05 апр. odgovor je dan 05. travnja 2014-04-05 04:42 '14 u 4:42 2014-04-05 04:42

Ono što bih želio učiniti je ukloniti SVU povijest inačice iz lokalnog Git repozitorija, tako da će se trenutni sadržaj spremišta prikazati kao jedina naredba (i stoga, starije verzije datoteka u spremištu nisu spremljene),

Više konceptualni odgovor:

git automatski smeće sakuplja stare naredbe ako oznake / grane / veze ne upućuju na njih. Dakle, samo trebate ukloniti sve oznake / grane i stvoriti novu obvezu siroča povezanu s granom - prema dogovoru dopuštate da master grana navede ovo urezivanje.

Stare, nepristupačne naredbe nitko više neće vidjeti, osim ako ne uđu u Gitove naredbe niske razine. Ako vam je to dovoljno, samo ću stati tamo i dopustiti automatskom GC-u da to učini kad god to želi. Ako ih se želite odmah riješiti, možete koristiti git gc (možda s --aggressive --prune=all ). Za udaljeno Git spremište to nećete moći učiniti ako nemate pristup datotečnom sustavu.

0
04 апр. odgovor je dao AnoE 04 apr. 2016-04-04 14:27 '16 u 14:27 sati 2016-04-04 14:27

Da biste to učinili, upotrijebite naredbu Shallow Clone git clone - dubina 1 URL - ona će samo klonirati trenutno spremište HEAD

-1
23 авг. Odgovor daje kkarki 23 aug. 2017-08-23 18:55 '17 u 18:55 2017-08-23 18:55

Da biste uklonili posljednju naredbu iz git-a, možete samo pokrenuti

 git reset --hard HEAD^ 

Ako izbrišete više od gore navedenih, možete pokrenuti

 git reset --hard HEAD~2 

za uklanjanje zadnje dvije obveze. Možete povećati broj da biste uklonili još više unosa.

Više informacija ovdje.

Git tutoturial ovdje pruža pomoć pri čišćenju spremišta:

Želite izbrisati datoteku iz povijesti i dodati je u .gitignore kako biste osigurali da se slučajno ne ponovi. Za naše primjere, uklonit ćemo Rakefile iz github gembita.

 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 

Sada kada smo izbrisali datoteku iz povijesti, jamčimo da to ne činimo slučajno.

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

Ako ste zadovoljni stanjem spremišta, morate prisiliti promjene da prepišu udaljeno spremište.

 git push origin master --force 
-1
05 июня '13 в 8:41 2013-06-05 08:41 odgovor se daje oktobankom 5. lipnja '13 u 8:41 2013-06-05 08:41

.git sam sličan problem jednostavnim uklanjanjem .git mape iz mog projekta i reintegracijom s kontrolom verzije putem IntelliJ-a. Napomena. Mapa .git je skrivena. Možete ga pogledati u terminalu s ls -a , a zatim ga izbrisati s rm -rf .git .

-1
11 апр. Odgovor dao JB Lovell 11. travnja 2017-04-11 21:54 '17 u 21:54 2017-04-11 21:54

Ostala pitanja o oznakama ili postavi pitanje