git pre-commit + mysqldump:找不到路径,不能找到现有命令

时间:2012-02-10 22:25:56

标签: git bash hook mysqldump

我有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 个答案:

答案 0 :(得分:1)

我也试图这样做,并得出了不同的结果,但最终确实有效。也许git自去年以来有一些更新解决了这个问题?也许是因为我在Mac上?这是我现在使用的预提交。 (感谢大家的帮助)

#!/bin/sh

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

注意:对{b}进行任何更改都不需要--skip-extended-insert,我就像在git中跟踪我的SQL转储一样,添加了额外的选项。

似乎重要的是我如何运行git命令

如果我从命令行运行git,则没有问题。

如果我通过SourceTree运行git,则会出现错误unless SourceTree is run from the commandline too.

答案 1 :(得分:0)

要调试sh,请使用

sh -x script

(评论设置-e

您可以在开头提供您的rc文件以避免使用完整路径:

source ~/.shrc

答案 2 :(得分:0)

如果git位于.profile / .bash_profile等的路径中,则不需要设置它。那说你只是“添加”文件而不是提交它。添加后,您需要运行

 git commit -m "updated schema"

答案 3 :(得分:0)

我修复了错误,它创建了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
  • 如果我们在路径中有空格,我们必须在double之间使用它 引号。
  • 我使用了exec和mysqldump.exe的完整路径而不是 mysqldump命令。
  • 通过mysqldump选项进行了一些更改:
    • 跳过评论(以防止由创建时间页脚引起的文件更改)
    • 通过sed
    • 将插入分成多行

答案 4 :(得分:0)

我知道OP已经找到了他的解决方案,但是对于任何寻找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