Зробити поточну фіксацію єдиною (початкової) фіксацією в репозиторії 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 якимось чином викличе для мене конфлікти (і у мене багато історії).

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

Іншим варіантом, який може виявитися великою роботою, якщо у вас багато коммітов, є інтерактивна rebase (якщо ваша версія git равнa> 1,7.12): git rebase --root -i

При поданні списку коммітов в вашому редакторі:

  • Змініть "pick" на "reword" для першого фіксації
  • Змініть "pick" на "fixup" кожен другий commit

Зберегти і закрити. git почне перезавантажуватися.

В кінці у вас буде новий кореневий фіксатор, який є комбінацією всіх тих, які прийшли після нього.

Перевага в тому, що вам не потрібно видаляти ваше сховище, і якщо у вас є інші думки, у вас завжди є резерв.

Якщо ви дійсно хочете знищити свою історію, reset master для цього фіксації і видалити всі інші гілки.

26
14 марта '12 в 23:24 2012-03-14 23:24 відповідь дан Carl 14 березня '12 о 23:24 2012-03-14 23:24

Видалити папку .git може привести до проблем в репозиторії git. Якщо ви хочете видалити всю свою історію фіксації.

виконайте наступні дії:

крок-1 (checkout)

 git checkout --orphan latest_branch 

step-2 (додайте всі файли)

 git add -A 

Крок 3 (Зафіксуйте зміни)

 git commit -am "commit message" 

step-4 (Видалити гілка)

 git branch -D master 

step-5 (перейменуйте поточну гілку на майстер)

 git branch -m master 

Крок 6 (остаточний крок, сила для поновлення вашого сховища)

 git push -f origin master 

!! Тепер насолоджуйтеся історією фіксації!

21
14 окт. відповідь дан Shivam Srivastava 14 Жовтня. 2017-10-14 12:08 '17 о 12:08 2017-10-14 12:08

Варіант запропонованого методу larsmans:

Збережіть список нецензурних файлів:

 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 апр. відповідь дан Matthias M 04 Квітня. 2016-04-04 14:05 '16 о 14:05 2016-04-04 14:05

Метод нижче відтворений, тому немає необхідності запускати клон знову, якщо обидві сторони узгоджені, просто запустіть script з іншого боку.

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

Якщо ви хочете його очистити, спробуйте script:

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

Я написав script, який "вбиває історію" для кожної гілки в репозиторії:

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

см. також: http://sam.nipl.net/b/confirm

2
06 февр. відповідь дан Sam Watkins 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 апр. відповідь дан jthill 05 Квітня. 2014-04-05 04:42 '14 о 4:42 2014-04-05 4:42

Що б я хотів зробити, це видалити ВСЕ історію версій з локального сховища Git, так що поточний зміст сховища буде відображатися як єдине коммітов (і, отже, більш старі версії файлів в репозиторії не зберігаються),

Більш концептуальний відповідь:

git автоматично сміття збирає старі коммітов, якщо теги / гілки / посилання не вказують на них. Таким чином, вам просто потрібно видалити всі теги / гілки і створити нову сирітську фіксацію, пов'язану з будь-якої гілкою - за згодою ви дозволите гілці master вказати на це commit.

Старі, недоступні коммітов ніколи більше не будуть помічені будь-ким, якщо вони не будуть копатися з низькорівневими командами 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 Серпня. 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 червня '13 о 8:41 2013-06-05 8: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

Інші питання по мітках або Задайте питання