Страницы

Поиск по вопросам

Показаны сообщения с ярлыком githooks. Показать все сообщения
Показаны сообщения с ярлыком githooks. Показать все сообщения

воскресенье, 12 января 2020 г.

Hook pre-checkout

#git #git_checkout #githooks


Появилась такая проблема, что ветки по-ошибке создаются не из мастера, а из существующих
ранее веток.

Решил впилить проверку на родительскую ветку в pre-checkout и был удивлен, что такого
хука нет. Post-checkout есть, а pre - нет.

Единственный путь который нашел - это написать обертку над checkout, но как это реализовать
- не имею представления.

Кто-то сталкивался с подобной ситуацией или знает как наваять обертку над checkout?
    


Ответы

Ответ 1



Это можно сделать с помощью post-checkout хука при создании новой ветки. Технические детали тут А логика в целом такая: в post-checkout, если это новая ветка, делаете git reset --hard master в принципе, команды создающие ветки - branch и checkout -b, насколько я понимаю, принимают аргумент start_point (branch - точно), в принципе, достаточно несложно, думаю, приделать в конфиги newbranch.default_starting_point, и в случае его наличия запатчить branch и checkout на создание ветки из значения, выставленного в конфиге гита (ну и продавить эту идею на гитхабе торвальдсу, или кто там ответственный) потом просто пинаете разработчиков, чтобы они проапдейтили конфиг и живете довольный

пятница, 27 декабря 2019 г.

Как сохранить git hooks во внешний репозиторий

#git #githooks


git v.1.9.5

win xp(x86)

Подскажите способ сохранить во внешнем репозитории хуки написанные в .git/hooks в
моем локальном репозитории.

Необходимо для репозитория-шаблона с которого будет осуществляться создание других
репозиториев.

Вопрос: есть репозиторий-шаблон на gitlab, например, пользователь создает новый на
базе шаблона, затем делает себе git clone созданного репозитория и получает в нем включенные
хуки из репозитория-шаблона, автоматизированно без рук, возможно?

UPD: Всегда есть вариант держать в корневой директории репозитория свою папку с хуками
и административно заставлять пользователя копировать руками хуки из нее в .git/hooks.
Но тут возникает проблема аля "я забыл, я не знал, etc..."

UPD: вроде бы есть путь через TEMPLATE DIRECTORY но если я правильно понял это относиться
к созданию нового репозитория локально а не с шаблона на gitlab, например, и в итоге
хуки будут все равно иметь расширение sample и опять необходимо руками убирать это
что бы активировать необходимые из них.

UPD: может быть есть какая то политика безопасности у git из-за которой он принципиально
против того что бы без ведома пользователя запускались какие-либо сценарии о которых
о может быть не предупрежден? И поэтому хуки всегда надо править ручками...
    


Ответы

Ответ 1



Как я и предполагал, есть политика безопасности, согласно этого ответа и коментариев к нему. No, putting them into the repository is fine, I’d even suggest doing so (if they are useful for others as well). The user has to explicitly enable them (as you said, for example by symlinking), which is on one hand a bit of a pain, but protects users on the other hand from running arbitrary code without their consent. Свою задачу я решил другим путем, через IDE, в которой я с помощью скриптов перехватываю событие сохранения бинарника и произвожу необходимые манипуляции с файлом. Хуки мне стали не нужны. Но если кто то предложит решение вопроса "без рук" и в рамках ОС и версии гит, указанных в вопросе, то возможно это будет интересно тем кто добавил вопрос в избранное и не только.

суббота, 14 декабря 2019 г.

Можно ли добавить требование обязательного указания номера issue при пуше в гит?

#git #github #githooks


На гитхабе есть удобная штука: пишешь комментарий к коммиту, указываешь номер issue
- и они связаны после пуша. Например:


  Добавлено логирование конвертаций. #50


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

Вопрос - есть ли готовые решения?

Если нет - а как это можно сделать?
    


Ответы

Ответ 1



(погуглить использование гитхуков), но я отвечу о минусах подхода "правильный коммит-месседж на сервер-сайде" на стороне сервера - не надо. если ты заставишь кодеров добавлять обязательные сообщения к коммиту, рано или поздно кто-нибудь сделает 120 коммитов локально, потом окажется, что один из коммитов (допустим, первый), прокомментирован неправильно. закомитить нельзя. придется звонить/писать/ставить тикет тебе. тебе посоветуют сделать rebase. rebase не сработает, потому, что кто-то выше по дереву изменил структуру каталогов. это трата времени. если хочешь энфорсить комменты, делай это на клиенте, чтобы человек, которому нужно что-то запушить _важное_и_срочное_ (такое бывает в продакшене боевом), мог сделать git commit --no-verify P.S. серверный гитхук, который не запрещает пушить, но сам проставляет номер патча или другую инфу полезную - это вполне ок.

Ответ 2



Visual Studio игнорит хуки, придётся коммитить вручную. В папку .git\hooks нужно добавить текстовый файл commit-msg Мне хватило вот такого простого (скопипастил отсюда): #!/usr/bin/env bash # regex to validate in commit msg commit_regex='(#[0-9]+|merge)' error_msg="Aborting commit. Your commit message is missing either a Issue ('#123') or 'Merge'" if ! grep -iqE "$commit_regex" "$1"; then echo "$error_msg" >&2 exit 1 fi На линуксах надо будет ещё разрешить выполнение: chmod +x commit-msg

воскресенье, 24 ноября 2019 г.

Настройка и развертывание проекта c помощью Git


Есть рабочий сайт, на этом же сервере есть гит-сервер (gitstack).

Как создать на сервере репозиторий с данным рабочим сайтом? 

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

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


Ответы

Ответ 1



Развертывание напрямую, без удаленного репозитория и Git-сервера Требования: доступ к серверу по SSH на локальной машине установлен git, а также rsync или git-sync на сервере Git не нужен Что делать? Не обязательно устанавливать Git на сервере или копировать туда папку .git. Чтобы обновить сервер из git-репозитория, вы можете использовать вот такую команду: git ls-files -z | rsync --files-from - --copy-links -av0 . user@server.com:/var/www/project Эта команда копирует все файлы. rsync использует ssh (secure shell), который в любом случае установлен на сервере. Но при этом вам, вероятно, придется вручную удалить файлы, которые были удалены из проекта (т.е. не изменились, а перестали существовать в очередном коммите). Вместо rsync можно использовать утилиту git-sync, написанную Яном Бикингом. Как утверждает автор, она работает с Git быстрее, чем rsync. Почему это хороший способ? Чем меньше ПО установлено у вас на сервере, тем более он защищен и тем проще ег администрировать и документировать. Кстати, это еще и исключает небоходимость хранить на сервере полный Git-репозиторий со всей историей. Это только усложнило бы задачу по обеспечению безопасности сервера. (Написано на основе ответа @Christian, блога Ian Bicking) Развертывание через удаленный репозиторий на сервере. Этот способ сопряжен с риском утечки данных! Были получены исходники 3300 глобальных интернет-проектов Требования: доступ к серверу по SSH на сервере установлен Git. на сервере установлен Git-сервер, например Gitlab или Gitstack. на локальной машине установлен Git. Если вы начинаете с сервера с файлами и без репозитория На сервере в папке с проектом выполните: git init git add --all git commit -m'сообщение, описывающее текущее состояние проекта' И переходите к следующему пункту. Если вы начинаете с сервера с файлами и репозиторием Выберите на локальной машине папку, где будет располагаться проект. Выполните там: git clone -o production username@webserver:/path/to/htdocs/.git Если вы начинаете с локального репозитория Скопируйте свою локальную папку .git на сервер. В локальной копии откройте .git/config и добавьте ваш сервер как remote: [remote "production"] url = username@webserver:/path/to/htdocs/.git Общая часть На сервере замените .git/hooks/post-update на код, приведенный ниже в этом ответе. На сервере добавьте этому файлу права на запись: chmod +x .git/hooks/post-update Теперь, когда вы делаете git push с локального репозитория, репозиторий на сервере должен автоматически обновлять рабочую директорию: git push production Полезные ссылки по теме: http://toroid.org/ams/git-website-howto https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps post-update hook: Git-hook нашел на этом сайте. #!/bin/sh # # This hook does two things: # # 1. update the "info" files that allow the list of references to be # queries over dumb transports such as http # # 2. if this repository looks like it is a non-bare repository, and # the checked-out branch is pushed to, then update the working copy. # This makes "push" function somewhat similarly to darcs and bzr. # # To enable this hook, make this file executable by "chmod +x post-update". git-update-server-info is_bare=$(git-config --get --bool core.bare) if [ -z "$is_bare" ] then # for compatibility's sake, guess git_dir_full=$(cd $GIT_DIR; pwd) case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac fi update_wc() { ref=$1 echo "Push to checked out branch $ref" >&2 if [ ! -f $GIT_DIR/logs/HEAD ] then echo "E:push to non-bare repository requires a HEAD reflog" >&2 exit 1 fi if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null) then wc_dirty=0 else echo "W:unstaged changes found in working copy" >&2 wc_dirty=1 desc="working copy" fi if git diff-index --cached HEAD@{1} >/dev/null then index_dirty=0 else echo "W:uncommitted, staged changes found" >&2 index_dirty=1 if [ -n "$desc" ] then desc="$desc and index" else desc="index" fi fi if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ] then new=$(git rev-parse HEAD) echo "W:stashing dirty $desc - see git-stash(1)" >&2 ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT git-update-ref --no-deref HEAD HEAD@{1} cd $GIT_WORK_TREE git stash save "dirty $desc before update to $new"; git-symbolic-ref HEAD "$ref" ) fi # eye candy - show the WC updates :) echo "Updating working copy" >&2 (cd $GIT_WORK_TREE git-diff-index -R --name-status HEAD >&2 git-reset --hard HEAD) } if [ "$is_bare" = "false" ] then active_branch=`git-symbolic-ref HEAD` export GIT_DIR=$(cd $GIT_DIR; pwd) GIT_WORK_TREE=${GIT_WORK_TREE-..} for ref do if [ "$ref" = "$active_branch" ] then update_wc $ref fi done fi Ответ написан на основе ответов с англоязычного StackOverflow. Дополнил, переработал, собрал в один ответ.

среда, 19 июня 2019 г.

git не работает post-receive

Здравствуйте!
Пытаюсь настроить деплой сайта с помощью гит по инструкции вот только когда на локальном компьютере выполняю git push production master то сам сайт не обновляется. Решил выполнить команду sh post-receive из консоли в ручную, комнда выполняется успешно и изменения для сайта применяются. Сделал вывод, что не по каким то причинам не запускается скрипт post-receive после завершения push`а.
Подскажите пожалуйста, у кого какие соображения?


Ответ

Проверьте что:
У вашего сценария есть право на запуск - он запускается просто по имени, без sh Что для теста вы использовали тот же логин, с которого делаете push

среда, 5 декабря 2018 г.

Как сохранить git hooks во внешний репозиторий

git v.1.9.5
win xp(x86)
Подскажите способ сохранить во внешнем репозитории хуки написанные в .git/hooks в моем локальном репозитории.
Необходимо для репозитория-шаблона с которого будет осуществляться создание других репозиториев.
Вопрос: есть репозиторий-шаблон на gitlab, например, пользователь создает новый на базе шаблона, затем делает себе git clone созданного репозитория и получает в нем включенные хуки из репозитория-шаблона, автоматизированно без рук, возможно?
UPD: Всегда есть вариант держать в корневой директории репозитория свою папку с хуками и административно заставлять пользователя копировать руками хуки из нее в .git/hooks. Но тут возникает проблема аля "я забыл, я не знал, etc..."
UPD: вроде бы есть путь через TEMPLATE DIRECTORY но если я правильно понял это относиться к созданию нового репозитория локально а не с шаблона на gitlab, например, и в итоге хуки будут все равно иметь расширение sample и опять необходимо руками убирать это что бы активировать необходимые из них.
UPD: может быть есть какая то политика безопасности у git из-за которой он принципиально против того что бы без ведома пользователя запускались какие-либо сценарии о которых о может быть не предупрежден? И поэтому хуки всегда надо править ручками...


Ответ

Как я и предполагал, есть политика безопасности, согласно этого ответа и коментариев к нему.
No, putting them into the repository is fine, I’d even suggest doing so (if they are useful for others as well). The user has to explicitly enable them (as you said, for example by symlinking), which is on one hand a bit of a pain, but protects users on the other hand from running arbitrary code without their consent.
Свою задачу я решил другим путем, через IDE, в которой я с помощью скриптов перехватываю событие сохранения бинарника и произвожу необходимые манипуляции с файлом. Хуки мне стали не нужны.
Но если кто то предложит решение вопроса "без рук" и в рамках ОС и версии гит, указанных в вопросе, то возможно это будет интересно тем кто добавил вопрос в избранное и не только.

воскресенье, 21 октября 2018 г.

Можно ли добавить требование обязательного указания номера issue при пуше в гит?

На гитхабе есть удобная штука: пишешь комментарий к коммиту, указываешь номер issue - и они связаны после пуша. Например:
Добавлено логирование конвертаций. #50
Другое дело, что я иногда забываю проставить этот номер, хотелось бы какую то проверку прикрутить, скорее на стороне сервера, но можно и локально.
Вопрос - есть ли готовые решения?
Если нет - а как это можно сделать?


Ответ

(погуглить использование гитхуков), но я отвечу о минусах подхода "правильный коммит-месседж на сервер-сайде"
на стороне сервера - не надо. если ты заставишь кодеров добавлять обязательные сообщения к коммиту, рано или поздно кто-нибудь сделает 120 коммитов локально, потом окажется, что один из коммитов (допустим, первый), прокомментирован неправильно.
закомитить нельзя. придется звонить/писать/ставить тикет тебе.
тебе посоветуют сделать rebase. rebase не сработает, потому, что кто-то выше по дереву изменил структуру каталогов.
это трата времени. если хочешь энфорсить комменты, делай это на клиенте, чтобы человек, которому нужно что-то запушить _важное_и_срочное_ (такое бывает в продакшене боевом), мог сделать git commit --no-verify
P.S. серверный гитхук, который не запрещает пушить, но сам проставляет номер патча или другую инфу полезную - это вполне ок.

понедельник, 1 октября 2018 г.

Настройка и развертывание проекта c помощью Git

Есть рабочий сайт, на этом же сервере есть гит-сервер (gitstack).
Как создать на сервере репозиторий с данным рабочим сайтом?
Т.е. нужно создать репозиторий, его я клонирую на локальный компьютер, что-то дорабатываю, делаю пуш, и после этого - то что я только что запушил должно быть сразу видно на рабочем сайте.
Ясно что лучше иметь отдельно сервер для разработки, отдельно или автоматом деплоить все, но увы - такие условия как я изложил.


Ответ

Развертывание напрямую, без удаленного репозитория и Git-сервера
Требования:
доступ к серверу по SSH на локальной машине установлен git, а также rsync или git-sync на сервере Git не нужен
Что делать?
Не обязательно устанавливать Git на сервере или копировать туда папку .git. Чтобы обновить сервер из git-репозитория, вы можете использовать вот такую команду:
git ls-files -z | rsync --files-from - --copy-links -av0 . user@server.com:/var/www/project
Эта команда копирует все файлы. rsync использует ssh (secure shell), который в любом случае установлен на сервере.
Но при этом вам, вероятно, придется вручную удалить файлы, которые были удалены из проекта (т.е. не изменились, а перестали существовать в очередном коммите).
Вместо rsync можно использовать утилиту git-sync, написанную Яном Бикингом. Как утверждает автор, она работает с Git быстрее, чем rsync.
Почему это хороший способ?
Чем меньше ПО установлено у вас на сервере, тем более он защищен и тем проще его администрировать и документировать. Кстати, это еще и исключает небоходимость хранить на сервере полный Git-репозиторий со всей историей. Это только усложнило бы задачу по обеспечению безопасности сервера.
(Написано на основе ответа @Christian, блога Ian Bicking)
Развертывание через удаленный репозиторий на сервере.
Этот способ сопряжен с риском утечки данных!
Были получены исходники 3300 глобальных интернет-проектов
Требования:
доступ к серверу по SSH на сервере установлен Git. на сервере установлен Git-сервер, например Gitlab или Gitstack на локальной машине установлен Git.
Если вы начинаете с сервера с файлами и без репозитория
На сервере в папке с проектом выполните:
git init git add --all git commit -m'сообщение, описывающее текущее состояние проекта'
И переходите к следующему пункту.
Если вы начинаете с сервера с файлами и репозиторием
Выберите на локальной машине папку, где будет располагаться проект. Выполните там:
git clone -o production username@webserver:/path/to/htdocs/.git
Если вы начинаете с локального репозитория
Скопируйте свою локальную папку .git на сервер. В локальной копии откройте .git/config и добавьте ваш сервер как remote
[remote "production"] url = username@webserver:/path/to/htdocs/.git
Общая часть
На сервере замените .git/hooks/post-update на код, приведенный ниже в этом ответе. На сервере добавьте этому файлу права на запись:
chmod +x .git/hooks/post-update Теперь, когда вы делаете git push с локального репозитория, репозиторий на сервере должен автоматически обновлять рабочую директорию:
git push production
Полезные ссылки по теме:
http://toroid.org/ams/git-website-howto https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps
post-update hook:
Git-hook нашел на этом сайте
#!/bin/sh # # This hook does two things: # # 1. update the "info" files that allow the list of references to be # queries over dumb transports such as http # # 2. if this repository looks like it is a non-bare repository, and # the checked-out branch is pushed to, then update the working copy. # This makes "push" function somewhat similarly to darcs and bzr. # # To enable this hook, make this file executable by "chmod +x post-update". git-update-server-info is_bare=$(git-config --get --bool core.bare) if [ -z "$is_bare" ] then # for compatibility's sake, guess git_dir_full=$(cd $GIT_DIR; pwd) case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac fi update_wc() { ref=$1 echo "Push to checked out branch $ref" >&2 if [ ! -f $GIT_DIR/logs/HEAD ] then echo "E:push to non-bare repository requires a HEAD reflog" >&2 exit 1 fi if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null) then wc_dirty=0 else echo "W:unstaged changes found in working copy" >&2 wc_dirty=1 desc="working copy" fi if git diff-index --cached HEAD@{1} >/dev/null then index_dirty=0 else echo "W:uncommitted, staged changes found" >&2 index_dirty=1 if [ -n "$desc" ] then desc="$desc and index" else desc="index" fi fi if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ] then new=$(git rev-parse HEAD) echo "W:stashing dirty $desc - see git-stash(1)" >&2 ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT git-update-ref --no-deref HEAD HEAD@{1} cd $GIT_WORK_TREE git stash save "dirty $desc before update to $new"; git-symbolic-ref HEAD "$ref" ) fi # eye candy - show the WC updates :) echo "Updating working copy" >&2 (cd $GIT_WORK_TREE git-diff-index -R --name-status HEAD >&2 git-reset --hard HEAD) } if [ "$is_bare" = "false" ] then active_branch=`git-symbolic-ref HEAD` export GIT_DIR=$(cd $GIT_DIR; pwd) GIT_WORK_TREE=${GIT_WORK_TREE-..} for ref do if [ "$ref" = "$active_branch" ] then update_wc $ref fi done fi
Ответ написан на основе ответов с англоязычного StackOverflow. Дополнил, переработал, собрал в один ответ.

Настройка и развертывание проекта c помощью Git

Есть рабочий сайт, на этом же сервере есть гит-сервер (gitstack).
Как создать на сервере репозиторий с данным рабочим сайтом?
Т.е. нужно создать репозиторий, его я клонирую на локальный компьютер, что-то дорабатываю, делаю пуш, и после этого - то что я только что запушил должно быть сразу видно на рабочем сайте.
Ясно что лучше иметь отдельно сервер для разработки, отдельно или автоматом деплоить все, но увы - такие условия как я изложил.


Ответ

Развертывание напрямую, без удаленного репозитория и Git-сервера
Требования:
доступ к серверу по SSH на локальной машине установлен git, а также rsync или git-sync на сервере Git не нужен
Что делать?
Не обязательно устанавливать Git на сервере или копировать туда папку .git. Чтобы обновить сервер из git-репозитория, вы можете использовать вот такую команду:
git ls-files -z | rsync --files-from - --copy-links -av0 . user@server.com:/var/www/project
Эта команда копирует все файлы. rsync использует ssh (secure shell), который в любом случае установлен на сервере.
Но при этом вам, вероятно, придется вручную удалить файлы, которые были удалены из проекта (т.е. не изменились, а перестали существовать в очередном коммите).
Вместо rsync можно использовать утилиту git-sync, написанную Яном Бикингом. Как утверждает автор, она работает с Git быстрее, чем rsync.
Почему это хороший способ?
Чем меньше ПО установлено у вас на сервере, тем более он защищен и тем проще его администрировать и документировать. Кстати, это еще и исключает небоходимость хранить на сервере полный Git-репозиторий со всей историей. Это только усложнило бы задачу по обеспечению безопасности сервера.
(Написано на основе ответа @Christian, блога Ian Bicking)
Развертывание через удаленный репозиторий на сервере.
Этот способ сопряжен с риском утечки данных!
Были получены исходники 3300 глобальных интернет-проектов
Требования:
доступ к серверу по SSH на сервере установлен Git. на сервере установлен Git-сервер, например Gitlab или Gitstack на локальной машине установлен Git.
Если вы начинаете с сервера с файлами и без репозитория
На сервере в папке с проектом выполните:
git init git add --all git commit -m'сообщение, описывающее текущее состояние проекта'
И переходите к следующему пункту.
Если вы начинаете с сервера с файлами и репозиторием
Выберите на локальной машине папку, где будет располагаться проект. Выполните там:
git clone -o production username@webserver:/path/to/htdocs/.git
Если вы начинаете с локального репозитория
Скопируйте свою локальную папку .git на сервер. В локальной копии откройте .git/config и добавьте ваш сервер как remote
[remote "production"] url = username@webserver:/path/to/htdocs/.git
Общая часть
На сервере замените .git/hooks/post-update на код, приведенный ниже в этом ответе. На сервере добавьте этому файлу права на запись:
chmod +x .git/hooks/post-update Теперь, когда вы делаете git push с локального репозитория, репозиторий на сервере должен автоматически обновлять рабочую директорию:
git push production
Полезные ссылки по теме:
http://toroid.org/ams/git-website-howto https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps
post-update hook:
Git-hook нашел на этом сайте
#!/bin/sh # # This hook does two things: # # 1. update the "info" files that allow the list of references to be # queries over dumb transports such as http # # 2. if this repository looks like it is a non-bare repository, and # the checked-out branch is pushed to, then update the working copy. # This makes "push" function somewhat similarly to darcs and bzr. # # To enable this hook, make this file executable by "chmod +x post-update". git-update-server-info is_bare=$(git-config --get --bool core.bare) if [ -z "$is_bare" ] then # for compatibility's sake, guess git_dir_full=$(cd $GIT_DIR; pwd) case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac fi update_wc() { ref=$1 echo "Push to checked out branch $ref" >&2 if [ ! -f $GIT_DIR/logs/HEAD ] then echo "E:push to non-bare repository requires a HEAD reflog" >&2 exit 1 fi if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null) then wc_dirty=0 else echo "W:unstaged changes found in working copy" >&2 wc_dirty=1 desc="working copy" fi if git diff-index --cached HEAD@{1} >/dev/null then index_dirty=0 else echo "W:uncommitted, staged changes found" >&2 index_dirty=1 if [ -n "$desc" ] then desc="$desc and index" else desc="index" fi fi if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ] then new=$(git rev-parse HEAD) echo "W:stashing dirty $desc - see git-stash(1)" >&2 ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT git-update-ref --no-deref HEAD HEAD@{1} cd $GIT_WORK_TREE git stash save "dirty $desc before update to $new"; git-symbolic-ref HEAD "$ref" ) fi # eye candy - show the WC updates :) echo "Updating working copy" >&2 (cd $GIT_WORK_TREE git-diff-index -R --name-status HEAD >&2 git-reset --hard HEAD) } if [ "$is_bare" = "false" ] then active_branch=`git-symbolic-ref HEAD` export GIT_DIR=$(cd $GIT_DIR; pwd) GIT_WORK_TREE=${GIT_WORK_TREE-..} for ref do if [ "$ref" = "$active_branch" ] then update_wc $ref fi done fi
Ответ написан на основе ответов с англоязычного StackOverflow. Дополнил, переработал, собрал в один ответ.