2014-09-30 5 views
0

Как я обычно проследовать:Git удаление файлов из истории, не дублируя предварительную ветвь совершает

На самом деле, чтобы удалить некоторые файлы с полной истории, я использую следующий сценарий (который я называю ГИТ-хруст):

#!/bin/bash 
# 
# git crunch <filenames> 
# 
git filter-branch --index-filter "git rm --cached --ignore-unmatch $*" 
rm -rf .git/refs/original/ 
git reflog expire --expire=now --all 
git fsck --full --unreachable 
git repack -A -d 
git gc --aggressive --prune=now 

Он отлично работает, чтобы удалить указанные файлы из (полной) истории.

Контекст:

У меня есть 1 проект, который разбивается на 4 ветви. Вот резюме сетевая диаграмма, которая показывает до 2 из 4 поддерживаемых веток:

┏ a937fd9 (1 year, 9 months ago) <new repo> 
... 
60 commits later, we create a branch "probe" which is displayed at left of the network 
... 
┣━┓ 
┣ ┃ c483a22 (8 months ago) 
┃ ┣ f7b402c (3 months ago) 
... 
┃ ┣━┓ 
┣ ┃ ┃ 38bb93d (11 days ago) 
┣ ┃ ┃ 1ef8202 (11 days ago) 
┃ ┃ ┣━[remotes/origin/S...H_adjust]──adb243f (8 days ago) 
┃ ┣ ┃ cd02775 (8 days ago) 
┃ ┣━┛ 
┃ ┣ f9e40a3 (8 days ago) 
┃ ┣ a30eb6f (7 days ago) 
┃ ┣━[remotes/origin/S...H_verif]──4a3fe66 (7 days ago) 
┃ ┗━[remotes/origin/HEAD]──[remotes/origin/master]──b452f85 (7 days ago) 
┣ 91477ae (4 days ago) 
┗━[HEAD]──[probe]──[remotes/origin/probe]──366c890 (48 minutes ago) 

Мой probolem является:

У меня есть 3 большие файлы в этом хранилище, которое может быть удален с самого начала (Creaton репозитория), но если я использую свой скрипт, он будет работать только в одной ветке, и он воссоздает 4 отдельных ветви с начала до последнего коммита, что произошло сегодня.

Моего вопрос:

Как я могу достичь этого удаления файлов 3 frmo всей своей истории, не отделяя свои ветви с самого начала? Или есть способ переписать всю цельность и удалить файлы со всех ветвей сразу, чтобы я мог сохранить свою эволюционную сеть, а «общая» совершает неповрежденную (так что я не получаю мои первые котировки, повторяющиеся четыре раза)?

+0

Dupe - http://stackoverflow.com/questions/7430717/git-filter-branch-on-all-branches –

ответ

1

лучший инструмент для выполнения, что на самом деле The BFG Repo Cleaner, более простой, быстрой альтернативой git filter-branch. Например:

$ bfg --strip-blobs-bigger-than 10M 

... удаляет все пятна больше, чем 10MB (которые не в вашем последних фиксации), и работает на всех ветвях & тегов в репозитории.

Полное раскрытие информации: Я являюсь автором BFG Repo-Cleaner.

+0

Большое спасибо, будь он, но был неясен, будет ли он дублировать или нет мои поручения для каждой ветки ... – menssana

+0

Я предполагаю, что есть способ указать имена файлов вместо размера? – menssana

+1

В общем, попробуйте его на копии вашего репо и посмотрите, что произойдет - BFG достаточно быстр, чтобы вам не потребовалось ни одного времени. BFG работает по всему вашему репо, для * всех * филиалов - у вас больше не будет никаких транзакций или филиалов, чем вы начали. Вы можете указать имена файлов (хотя и не пути), если вы, например («--delete-files»), - в вашем случае с тремя огромными файлами, я просто использовал бы «-strip-blobs-больше-чем». –

Смежные вопросы