git pre-commit + mysqldump: не может найти путь, не существует команды - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть windows 7, но я думаю, что это не считается, потому что хук использует git shell. Я попытался вывести свою базу данных с помощью коммита со следующим кодом, но это не сработало.

#!/bin/sh
# Refresh the SQL schema file for inclusion within the git commit

# If something fails, exit with status other than 0
set -e

# select dump directory
    cd $(git rev-parse --show-toplevel)
    cd WebShop/DataBase

# first, remove our original schema
rm -f backup.sql

# generate a new schema
mysqldump -u root --password=root webshopdb > backup.sql

# Add the schema to the next commit
git add backup.sql

# Exit success
exit 0

У меня 2 сообщения об ошибке:

Путь не существует, потому что пробел в имени каталога нарушает его.

    cd $(git rev-parse --show-toplevel)

Не удается найти команду

    mysqldump -u root --password=root webshopdb > backup.sql

Можно ли это исправить?

Ответы [ 5 ]

1 голос
/ 05 мая 2013

Я тоже пытался это сделать, и получил смешанные результаты, но в конечном итоге это работает.Может быть, в git было несколько обновлений с прошлого года, которые исправили проблему?Может это потому что я на маке?Вот предварительный коммит, который я сейчас использую.(Спасибо всем).

#!/bin/sh

# Dump a fresh copy of the database
mysqldump -u root --password="password" myDB --skip-extended-insert > dump.sql
git add dump.sql

Примечание: --skip-extended-insert не требуется для внесения каких-либо изменений в bash, мне просто нравится, как мои дампы SQL могут отслеживаться в gitдобавлена ​​дополнительная опция.

мне показалось важным то, как я выполняю команду git

Если я запускаю git из командной строки,без проблем.

Если я запускаю git через SourceTree, то возникают ошибки , если SourceTree не запускается и из командной строки.

0 голосов
/ 22 июня 2015

Я знаю, что ОП уже нашел свое решение, но для тех, кто ищет ловушку pre-commit для mysqldump, проверьте этот Gist ... он должен сделать эту работу за вас: https://gist.github.com/wilcollins/dfa33ef20caf6dab5826

#!/bin/bash -e
# -e means exit if any command fails
DBHOST=address.to.your.server
DBUSER=username
DBPASS=password # do this in a more secure fashion
DBNAME=DBNAME
GITREPO=/where/is/your/repo
DUMP=$GITREPO/where/you/store/dumps
NEW=$DUMP/schema.sql
OLD=$NEW.old

DIR=$(pwd)
cd $GITREPO

mv $NEW $OLD

mysqldump -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME --skip-dump-date --single-transaction > $NEW

# NOTE : the new schema.sql file & location need to be added to your GIT repo & ignore .old

if cmp -s $OLD $NEW; then
    echo Same
else
    echo Differ
    git commit $NEW -m "$DBNAME DB update"
    echo "schema+data committed"

    git push # assuming you have a remote to push to
    echo "schema+data pushed"
fi
cd $DIR
0 голосов
/ 11 февраля 2012

Если git находится на вашем пути в вашем .profile / .bash_profile и т. Д., Вам не нужно его устанавливать. Тем не менее, вы только «добавляете» файл, а не фиксируете его. После добавления нужно запустить

 git commit -m "updated schema"
0 голосов
/ 11 февраля 2012

Я исправил ошибки, он создает файл sql, но все равно не добавляет его в коммит. Я не знаю почему ...

Фиксированный код:

#!/bin/sh
# Refresh the SQL schema file for inclusion within the git commit

# If something fails, exit with status other than 0
set -e

# select dump directory
cd "$(git rev-parse --show-toplevel)"

# first, remove our original schema
rm -f "WebShop\DataBase\backup.sql"

# generate a new schema
exec "C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqldump.exe" --skip-comments -u root --password=root webshopdb |sed 's$),($),\n($g' > "WebShop\DataBase\backup.sql"

# Add the schema to the next commit
git add "WebShop\DataBase\backup.sql"

# Exit success
exit 0
  • Если у нас есть пробел на пути, мы должны использовать его между двойными котировки.
  • Я использовал exec и полный путь к mysqldump.exe вместо команда mysqldump.
  • Внесены некоторые изменения в параметрах mysqldump:
    • пропуск комментариев (для предотвращения изменения файла, вызванного нижним колонтитулом времени создания)
    • разделить вставку на несколько строк с помощью sed
0 голосов
/ 11 февраля 2012

Для отладки sh, используйте

sh -x script

(комментарий set -e )

, и вы можете получить исходный файл rc в начале, чтобы избежать использования полных путей:

source ~/.shrc
...