2013-10-15 2 views
2

Как удалить всю историю чего-либо в любом филиале, но файлы, существующие в настоящее время на HEAD (моя главная ветка)?Как удалить историю Git чего-либо, кроме текущих файлов

Я делал такие вещи, как

git filter-branch -f --prune-empty --index-filter \ 
    "git rm -rf --cached --ignore-unmatch '*.js' '*.html' '*.css'" \ 
     HEAD 

, но это становится утомительным, так как я должен сделать явным то, чтобы удалить, не то, чтобы держать.

Git в принципе должен быть в состоянии определить всех предков текущих файлов, вернуться в историю и удалить все, что не принадлежит предкам. Как?

Я сдался: все это переписывание истории кажется очень хрупким и беспорядочным. Это отстой. Я просто копирую файлы и кусаю пулю потери истории.

+0

Просто из любопытства: зачем это нужно? Это кажется довольно необычной идеей. – sleske

+0

Почему бы вам просто не сгладить историю с помощью rebase? Вместо того, чтобы искажать историю, просто избавляй ее от своих страданий. –

+0

@ dan-d: Все дело в том, чтобы сохранить историю файлов сейчас в HEAD. В противном случае я мог бы просто создать новое репо с нуля и скопировать файлы. Или я понимаю неправильно? – oberstet

ответ

1

Почему бы не удалить все файлы в первую очередь, а затем добавить те, которые вы хотите? Что-то вдоль этих линий:

git ls-files HEAD > /tmp/files 
git filter-branch ... --index-filter \ 
    "git rm *; xargs -a /tmp/files git add" --all 

Кроме того, почему вы используете ГОЛОВА в вашей команде фильтра Гис, если вы хотите, чтобы отфильтровать все ветви (--all)?

+0

Спасибо за '-all' намек. Будет ли ваше предложение сохранять историю в файлах, которые не удаляются? – oberstet

+0

Примечание: вам нужно использовать '- --all'. Другое не работает. Таким образом, это 'git filter-branch -f --pune-empty -index-filter 'git rm -rf --cached --ignore-unmatch' * .js '" - --all', например. – oberstet

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