2015-07-06 3 views
2

Я работаю над приложением PAAS. Мы предоставляем функцию развертывания GIT, где мы извлекаем код из Git repo в каталог temp и копируем данные в рабочий общий каталог сервера.Get Deleted files list from Git Commits

Проблема с этим подходом заключается в том, что он не удаляет файлы из рабочей публики напрямую, которые были удалены в Git Repo. Я вижу, что такие приложения, как DeployHQ, каким-то образом извлекают этот список из Git Commits.

Должен ли я разбирать историю Git для этого или есть какие-либо инструменты с открытым исходным кодом, которые извлекают список удаленных/измененных файлов из истории фиксации Git.

ответ

2
git log --diff-filter=D --summary 

Это будет сделано. Но если вы удалили файл и создали его с тем же именем, он не будет списком.

2

Это не обязательно проблема Git, но проблема в том, как вы копируете файлы. Если вы используете простую команду cp, она не удалит файлы, которые были удалены в исходной папке, она просто скопирует все новые или обновленные файлы. В вашем целевом каталоге по-прежнему будут файлы, которые были удалены в исходной папке.

Вот два способа получения этой работы:

Вариант 1: Переименовать целевой каталог

Вы в основном копировать файлы из репозитория Git в новый пустой каталог. Затем удалить предыдущую целевую папку и переименовать новую папку в общей папке:

cp -r git_repo/* temp 
rm -rf public 
mv temp public 

Это позволит сделать полный разрыв, так как вы переключаетесь каталогов с помощью команды mv. На этом этапе новая папка станет активной. Вы можете столкнуться с проблемами, если процесс сохраняет ссылки на файлы в старой папке.

Вариант 2: Rsync

Вместо того, чтобы использовать команду cp, вы можете использовать что-то вроде rsync, который позволит вам копировать изменения, а также удалить файлы, которые больше не существуют. Проверьте страницу rsync людей для получения дополнительной информации и примеров: http://linux.die.net/man/1/rsync

Вот пример, чтобы вы начали:

rsync -avrKL --progress -d --delete-excluded --exclude=.git git_repo/ public/ 

Одним из преимуществ rsync является то, что это довольно эффективным - он не будет копировать любые неизмененные файлы , Как только вы выполните первый запуск, он будет копировать только изменения, новые файлы или удалять удаленные файлы, все остальное останется в покое.

Дополнительным преимуществом rsync является то, что вы можете настроить то, что он копирует, используя переключатели --exlude. Аналогичным образом вы можете использовать коммутаторы --include с шаблонами подстановочных знаков.

Чтобы убедиться, что файлы, удаленные в исходной папке, удалены из целевой папки, обязательно используйте косую черту в конце исходной папки в командной строке rsync. Это сообщит rsync для синхронизации всей папки.

0

Вы хотели бы попробовать следующую картину:

# Fetch the new content, but don't start using it yet 
git fetch 
# List the deletions between the current content and the incoming 
git diff HEAD FETCH_HEAD --summary --diff-filter=D 
# Update workspace to the new content 
git merge FETCH_HEAD