Список файлов, затронутых последним git pull - PullRequest
0 голосов
/ 13 февраля 2020

Вопрос похож на этот: Как вывести список всех файлов в коммите?

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

Это может быть один коммит (в этом случае я мог бы сойти с рук git show --name-only --oneline HEAD, но может быть и несколько - и это сложная часть.

Практический пример: сценарий развертывания, подобный следующему:

git stash
git pull origin production

# ... some other stuff ...

assets=$(git show --name-only --oneline ??LAST_GIT_PULL_RANGE?? | fgrep 'resource/assets' | wc -l)
test $assets -gt 0 && npm run production

(компилирует только ресурсы js / css если в каталоге resource/assets произошли изменения)

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Это немного сложно по нескольким причинам:

  1. git pull означает run git fetch, затем выполните вторую команду Git, чтобы включить все, что было получено.
  2. Git не записывает здесь , какая вторая команда используется. Вторая команда выбирается тем, кто запускал git pull, поэтому вам нужно убедиться, что тот, кто ее запускал, запомнил, какую команду он выбрал. (Выбор основывается как на параметрах командной строки, так и на Git настройках конфигурации.)
  3. Команда, которую необходимо использовать для получения правильного ответа, зависит как от , что поступило , так и какая вторая команда использовалась .

Практический пример: скрипт развертывания ...

Скрипты развертывания никогда не должны использовать git pull, поэтому это дает вам простой выход из проблемы: просто не используйте git pull в сценарии развертывания. Запустите git fetch, затем введите собственную вторую команду Git. Теперь вы точно знаете , какую секунду команду использовали, потому что ваш скрипт , а не пользователь, выполняющий ваш скрипт, выбрал эту вторую команду.

Теперь давайте предположим, что вторая команда, которую вы выбираете в своем скрипте, git merge. Здесь все еще есть проблема, потому что git merge может выполнить быстрое слияние, но может выполнить реальное слияние. Если происходит реальное слияние, слияние может fail . Если вы скажете , выполните только ускоренное слияние (используя git merge --ff-only), что также может привести к сбою, если требуется реальное слияние.

Не существует единого правильного действия для всех случаи здесь. Вы должны решить, чего хотите добиться, исходя из ваших ситуаций. Но давайте предположим, на данный момент, что git merge --ff-only вместе с проверкой вида «если слияние завершится неудачей, полностью прервать развертывание» достаточно. Тогда ваш скрипт будет содержать следующие строки:

git fetch origin || die ...
starthash=$(git rev-parse HEAD) || die ...
git merge --ff-only || die ...

, где die - это написанная вами функция оболочки, которая прерывает это развертывание. Другими словами, мы будем:

  1. Использовать git fetch origin для обновления нашего локального репозитория Git новыми коммитами из origin, обновления origin/master, origin/develop и т. Д.

    Это то, что делает первая строка, git fetch origin || die .... Опять же, вы должны написать функцию die.

  2. Сохранить текущий идентификатор ha sh, чтобы мы знали, какая фиксация была текущей до мы запустили git merge --ff-only.

  3. Выполнить git merge --ff-only, чтобы получить слияние с ускоренной перемоткой вперед или сбой, если слияние с ускоренной перемоткой невозможно (если реальное слияние требуется).

    (Примечание: если вы хотите попробовать реальное слияние для этого случая, это усложняет развертывание! Вам нужно будет решить, что делать, если реальное слияние прекращается получить помощь от пользователя.)

Если все вышеперечисленное go хорошо, теперь вы готовы сравнить то, что было в коммите HEAD до * От 1091 * до что входит в HEAD коммит после git merge --ff-only. Вы делаете это с помощью простого git diff или для надежности в сценарии git diff-tree. (Команду git diff-tree в целом немного сложнее использовать, но на нее не влияют конфигурации для каждого пользователя, поэтому целесообразно использовать git diff-tree в любом сценарии, , а не , ориентированном на пользователя. ) Теперь вы можете запустить:

git diff --name-only $starthash HEAD

или:

git diff-tree --name-only $starthash HEAD

В этом случае оба выдают одинаковый вывод за исключением , в котором git diff-tree имеет переименование детектор выключен независимо от конфигурации пользователя git diff. Это будет иметь видимое различие, только если детектор переименования включен и находит переименование, и даже тогда это будет неочевидным, если вы не переключитесь с --name-only на --name-status: вы увидите, что один add-файл и один файл удаления заменяется одной операцией переименования файла из старого имени в новое имя.

0 голосов
/ 13 февраля 2020

Вы можете попробовать git diff --name-only ??LAST_GIT_PULL_RANGE?? --oneline.
Это прекрасно работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...