2016-12-22 5 views
0

У меня есть несколько «интересных» файлов (которые я коснулся) среди всех других файлов в истории Git. И я хочу опубликовать «интересные» файлы только с их историей как Git repo, без каких-либо других файлов, присутствующих где-либо в истории этого репо.удалить все, кроме выбранных файлов во всех Git commits

Как написать смарт-скрипт для git filter-branch --index-filter? (. Или, по крайней мере, для git filter-branch --tree-filter, которое, однако, нежелательно, так как это происходит медленнее, и мои сохраненные деревья огромны)

Обратите внимание, что мой вопрос немного отличается от наиболее распространенных подобных одних людей просят 12: Как удалить определенный («чувствительный») файл из истории Git? Мне нужно удалить дополнение и сохранить определенные файлы.

ответ

0

Итак, сложная часть в этом скрипте для git filter-branch --index-filter - это получить список файлов из индекса, отфильтровать конкретные, а затем удалить результирующий список.

Я реализовал это как отдельный исполняемый файл git-update-index-keeping-only; здесь колючек реализация:

git ls-files --full-name \ 
| fgrep -v -x -f <(echo "$FILELIST") \ 
| xargs git rm --cached "[email protected]" -- 

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

Образец использования записан в другом скрипте, полезном для моего прецедента: получите список интересных, как те, которые были изменены или добавлены в разницу между двумя коммитами (например, «вверх по течению» и последним фиксацией поверх что).

Это git-filter-only-files-modified-since; его суть такова:

FILES="$(git diff-tree "$SINCE": HEAD: \ 
    -r --name-only --diff-filter=MACRT)" 
export FILES 
git filter-branch \ 
    --index-filter 'echo "$FILES" | git-update-index-keeping-only -q' 
Смежные вопросы