Как я могу запустить make-файл в каждой ветке git? - PullRequest
2 голосов
/ 24 октября 2011

У меня есть репозиторий git с несколькими ветками. В репозитории есть make-файл, который одинаков между ветками. Я хотел бы создать сценарий bash, который можно запускать на регулярной основе, который извлекает все ветви из удаленного репозитория, а затем запускает make для каждой ветви, которая была изменена или добавлена. Созданный исполняемый файл затем перемещается в другое место на сервере, и перед началом следующей обрабатываемой ветви запускается make make clean.

Порядок команд, которые я буду выполнять, будет

make
cp executable /some/other/directory/branch_name
make clean

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

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

Я бы сделал что-то вроде этого:

# fetch updates, but don't merge yet
git fetch    # origin is default

# list all branches
git for-each-ref --format='%(refname:short)' refs/heads |
while read branch; do
    # if the branch is not the same as the remote branch...
    if [ "$(git rev-parse $branch)" != "$(git rev-parse origin/$branch)" ]; then
         # only continue to the next step on successful results
         git checkout $branch &&
         git pull &&
         (make &&
         cp executable /somewhere/else;
         make clean)
         # except always make clean as long as we tried to make
         #
         # you might also consider a hard reset and clean, to guarantee things
         # are safe for the next checkout
    fi
done

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

Очевидно, что при обработке ошибок необходимо сделать выбор; Я просто пошел с самой простой вещью, которая все еще имела смысл. Для более сложной обработки вы можете вместо этого сделать что-то вроде if make; then ...; else ...; fi, например ::100100

# die hard on unexpected checkout/pull failures
if ! (git checkout $branch && git pull); then
    exit 1
fi
if make; then
    cp executable /somewhere/else
else
    # report a build failure?
fi
# clean up no matter what
git clean -xdf
git reset --hard
0 голосов
/ 24 октября 2011

Ну, git pull генерирует вывод, который может быть grep 'd, чтобы определить, какие ссылки были обновлены.После этого просто зацикливать совпадения, возвращаемые grep, с циклом for ... in ....

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