2012-05-20 2 views
22

Я пытаюсь разбить подпроект с моего репозитория git. Однако, в отличие от Detach (move) subdirectory into separate Git repository У меня его нет в его собственном подкаталоге (и перемещение его и выполнение выше всего дает историю после переезда).Удалить удаленные файлы из git history

Я клонировал ветку, из которой я хочу отделить подпроект в своем собственном репозитории и удалить все, что не используется подпроектом, поэтому в основном я мог бы использовать это как репозиторий моего подпроекта.

Теперь я хочу избавиться от истории всех файлов, которые больше не находятся в этом репозитории, чтобы сохранить историю файлов только для файлов, которые превратили их в потомство.

Я думаю, что это должно быть возможно с GIT-фильтр-отрасли, но я не могу понять, как

Большое спасибо заранее

+0

См. Также [Новое репо с копией истории только отслеживаемых файлов] (http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files) , –

ответ

5

Here are some instructions to do what you want.

Это удалит file_to_remove:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all 
+19

Дело в том, что я хочу просто хранить файлы и их историю в рабочем каталоге и забыть обо всех остальных. Было бы довольно громоздко сначала найти все удаленные файлы и удалить их с помощью приведенной выше команды, поэтому, хотя я нашел, что это не слишком полезно –

1

Хорошо, теперь я пытаюсь использовать следующую технику, будет отчитываться, если она сработает, потому что она выглядит довольно долго:На Zsh или Баш НА клонированного Repository

git log --diff-filter=D --summary <start_commit>..HEAD | egrep -o '*[[:alnum:]]*(/[[:alnum:].]*)+$' > deleted.txt 

, чтобы получить все удаленные файлы

for del in `cat deleted.txt` 
do 
    git filter-branch --index-filter "git rm --cached --ignore-unmatch $del" --prune-empty -- --all 
    # The following seems to be necessary every time 
    # because otherwise git won't overwrite refs/original 
    git reset --hard 
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 
    git reflog expire --expire=now --all 
    git gc --aggressive --prune=now 
done; 

Это может быть экстремально dangeours для ваших данных, так только примерить клонов.

+0

Что вы в итоге нашли? –

+1

Причина, по которой она работает так медленно для вас, заключается в том, что вы запускаете команду 'git filter-branch' *** для каждого файла *** вместе с несколькими другими командами (' git gc' is not дешевая или быстрая команда для запуска) вместо того, чтобы запускать ее *** один раз для всех файлов ***, так что это, вероятно, крайне неэффективно. См. Комментарии в [Новое репо с копией истории только отслеживаемых файлов] (http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files). –

+0

Будет ли нажатие на github или gitlab очистить удаленный репозиторий? –

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