git diff-tree не работает в перехвате после получения - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть пустой удаленный репозиторий с исходными файлами, в который я хочу создавать только измененные файлы после его отправки.Я подумал, что лучший способ определить, какие файлы были изменены, - это поместить команду changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD) в ловушку после получения.

Однако переменная заканчивается пустой, как я и подтвердил, передав ее вфайл.Если я поставлю HEAD ^ вместо HEAD, он покажет измененные файлы со второго по самый последний коммит.Тем не менее, он не показывает самые последние изменения, когда я ставлю HEAD, а просто ничего не показывает.

Кто-нибудь может мне помочь?Или есть более разумный подход к моей проблеме в целом?

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

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

ОК, я понял: я получаю ошибку

remote: fatal: ambiguous argument 'HEAD': both revision and filename

в команде push, которую я не заметил.После изменения

changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD)

на

changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD --)

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

0 голосов
/ 15 декабря 2018

В момент выполнения ловушки post-receive все ссылки уже обновлены.Следовательно, HEAD означает новую голову, а не старую.Это может не дать желаемых результатов, поскольку предполагается, что существует один коммит без слияния, и вы хотите использовать diff с его родителем, в то время как вы, возможно, выдвинули слияние или несколько коммитов.

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

#!/bin/sh

while read old new ref
do
    # Handle created or deleted branches.
    echo $old | grep -qsE '^0+$' && old=$(git hash-object -t tree /dev/null)
    echo $new | grep -qsE '^0+$' && new=$(git hash-object -t tree /dev/null)
    git diff-tree --no-commit-id --name-only -r "$old" "$new"
done
...