Направете текущия ангажимент един (първоначален) ангажимент в хранилището на git?

В момента разполагам с местно хранилище Git, което кликвам в хранилището на Github.

Локалното хранилище има ~ 10 ангажименти, а хранилището на Github е синхронизирано дубликат на това.

Това, което бих искал да направя, е да премахна цялата история на версиите от местното хранилище на Git, така че текущото съдържание на хранилището ще се покаже като единствено коммитиране (и следователно по-старите версии на файловете в хранилището не се запазват),

Бих искал да кликнете върху тези промени в Github.

Аз проучих Git rebase, но това изглежда по-подходящо за премахване на някои версии. Друго потенциално решение е да се премахне местното репо и да се създаде нова, въпреки че това вероятно ще създаде много работа!

ETA: Има определени директории / файлове, които не се наблюдават - ако е възможно, бих искал да подкрепя деактивирането на тези файлове.

460
13 марта '12 в 14:41 2012-03-13 14:41 kaese е поставен на 13 март , '12 в 14:41 ч. 2012-03-13 14:41
@ 14 отговора

Ето един подход на груба сила. Той също така премахва конфигурацията на хранилището.

Забележка. Това НЕ работи, ако в хранилището има подмодули! Ако използвате подмодули, трябва да използвате, например, интерактивно рестартиране.

Стъпка 1: изтрийте цялата история ( уверете се, че имате резервно копие, не е възможно да се върнете )

 rm -rf .git 

Стъпка 2: възстановете хранилището на Git само с текущо съдържание

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

Стъпка 3: Кликнете върху GitHub.

 git remote add origin <github-uri> git push -u --force origin master 
747
13 марта '12 в 14:44 2012-03-13 14:44 Отговор от Fred Foo на 13 март '12 в 14:44 ч. 2012-03-13 14:44

Единственото решение, което работи за мен (и работата на подмодулите) е

 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/ винаги причинява огромни проблеми, когато имам под-модули. Използването на git rebase --root ми причини git rebase --root конфликти (и имам много история).

410
27 окт. отговор, даден на Zeelot 27 октомври. 2012-10-27 21:16 '12 в 21:16 2012-10-27 21:16

Това е моят благоприятен подход:

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

Това ще създаде нов клон с едно обвързване, което ще добави всичко към HEAD. Това не променя нищо, така че е напълно безопасно.

63
22 марта '13 в 16:53 2013-03-22 16:53 отговорът е даден dan_waterworth 22 март '13 в 16:53 2013-03-22 16:53

Друга опция, която може да бъде много работа, ако имате много ангажименти, е интерактивна ребаза (ако вашата версия на git е> 1.7.12): git rebase --root -i

При представяне на списък с ангажименти във вашия редактор:

  • Променете "pick" до "reword" за първия ангажимент
  • Променете "pick", за да "fixup" всеки друг ангажимент

Запазете и затворете. git ще се рестартира.

Накрая ще имате нов коренов ретейнер, който е комбинация от всички, които дойдоха след него.

Предимството е, че не е необходимо да изтривате хранилището си и ако имате други мисли, винаги имате резерв.

Ако наистина искате да унищожите историята си, нулирайте master за този ангажимент и изтрийте всички други клонове.

26
14 марта '12 в 23:24 2012-03-14 23:24 отговорът е даден от Carl на 14 март '12 в 23:24 ч. 2012-03-14 23:24

Изтриването на папката .git може да доведе до проблеми в хранилището на git. Ако искате да изтриете цялата история на фиксиране.

изпълнете следните стъпки:

стъпка-1 (плащане)

 git checkout --orphan latest_branch 

стъпка-2 (добавяне на всички файлове)

 git add -A 

Стъпка 3 (Проверка на промените)

 git commit -am "commit message" 

стъпка 4 (Изтриване на клон)

 git branch -D master 

стъпка-5 (преименуване на текущия клон за управление)

 git branch -m master 

Стъпка 6 (последна стъпка, за да актуализирате хранилището си)

 git push -f origin master 

!! Сега се насладете на историята на фиксацията!

21
14 окт. отговорът е даден от Шивам Сривастава на 14 октомври. 2017-10-14 12:08 '17 в 12:08 2017-10-14 12:08

Вариант на предложения метод на Ларсманс:

Запазване на списъка с файлове, които не са отпечатани:

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

Запазване на конфигурацията на git:

 mv .git/config /tmp/ 

След това следвайте първите стъпки на larsmans:

 rm -rf .git git init git add . 

Възстановяване на конфигурацията:

 mv /tmp/config .git/ 

Отхвърлете неизпитаните файлове:

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

След това поправете:

 git commit -m "Initial commit" 

Накрая кликнете върху хранилището си:

 git push -u --force origin master 
14
19 апр. отговор, даден от lalebarde на 19 април 2014-04-19 11:58 '14 в 11:58 2014-04-19 11:58

Създайте клон, копирайте цялото съдържание в него, копирайте го и след това изтрийте основния клон:

 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 отговорът е даден pratik_bhavsar 12 март, '17 в 17:53 2017-03-12 17:53

Можете да използвате плитки клонинги (git> 1.9):

 git clone --depth depth remote-url 

Допълнителна информация: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

5
04 апр. отговорът е даден от Матиас М 04 апр. 2016-04-04 14:05 '16 в 14:05 часа 2016-04-04 14:05

Методът по-долу е възпроизводим, така че няма нужда да се стартира отново клонингът, ако и двете страни са последователни, просто стартирайте скрипта от другата страна.

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

Ако искате да го почистите, опитайте скрипта:

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

Написах скрипт, който "убива история" за всеки клон в хранилището:

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

Вижте също: http://sam.nipl.net/b/confirm

2
06 февр. Отговорът беше даден от Сам Уоткинс на 06 февруари. 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 

Това ще премахне всички локални клонове и маркери, ще направи едно събитие без история с състоянието на текущата ви проверка във всеки клон на текущия и ще остави всичко останало във Вашето репо. След това можете насилствено да кликнете върху дистанционните си устройства, колкото желаете.

1
05 апр. отговорът е даден на 05 април 2014-04-05 04:42 '14 в 4:42 2014-04-05 04:42

Това, което бих искал да направя, е да премахна цялата история на версиите от местното хранилище на Git, така че текущото съдържание на хранилището ще се покаже като единствено коммитиране (и следователно по-старите версии на файловете в хранилището не се запазват),

По-концептуален отговор:

git автоматично събира отпадъци стари коммити, ако таговете / клоновете / връзките не сочат към тях. По този начин просто трябва да премахнете всички тагове / клонове и да създадете нов сирак, свързан с клон - по съгласие ще разрешите на master клон да посочи този ангажимент.

Стари, недостъпни коммити никога повече няма да се виждат от никого, освен ако не се впуснат в ниските Git команди. Ако това е достатъчно за вас, просто ще спрем там и ще позволя на автоматичния GC да го прави, когато пожелае. Ако искате да се отървете от тях веднага, можете да използвате git gc (може би с --aggressive --prune=all ). За отдалечено хранилище на Git няма да можете да направите това, освен ако нямате достъп до файловата система.

0
04 апр. отговорът се дава от AnoE 04 апр. 2016-04-04 14:27 '16 в 14:27 ч. 2016-04-04 14:27

За да направите това, използвайте командата Shallow Clone git clone --depth 1 URL - тя ще клонира само текущото хранилище HEAD

-1
23 авг. Отговорът е даден от kkarki 23 aug. 2017-08-23 18:55 '17 в 18:55 часа 2017-08-23 18:55

За да премахнете последното фиксиране от git, можете просто да стартирате

 git reset --hard HEAD^ 

Ако изтриете няколко коммита по-горе, можете да стартирате

 git reset --hard HEAD~2 

за да премахнете последните две ангажименти. Можете да увеличите броя, за да премахнете още повече корекции.

Повече информация тук.

Git tutoturial тук предоставя помощ за изчистване на хранилището:

Искате да изтриете файла от историята и да го добавите в .gitignore, за да се уверите, че не е случайно повторен. За нашите примери ще премахнем Rakefile от хранилището на github gem.

 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 

Сега, след като изтрихме файла от историята, нека гарантираме, че не го правим случайно.

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

Ако сте доволни от състоянието на хранилището, трябва да принудите промените да презапишат отдалеченото хранилище.

 git push origin master --force 
-1
05 июня '13 в 8:41 2013-06-05 08:41 Отговорът е даден като octoback 05.06.13 в 8:41 2013-06-05 08:41

Реших подобен проблем, като просто премахнах папката .git от моя проект и се реинтегрира с контрол на версиите чрез IntelliJ. Забележка. Папката .git е скрита. Можете да го видите в терминала с ls -a и след това да го изтриете с rm -rf .git .

-1
11 апр. Отговор, даден от JB Lovell на 11 април 2017-04-11 21:54 '17 в 21:54 часа 2017-04-11 21:54

Други въпроси относно тагове или Ask a Question