9

我使用 git 从网站上对 mysql 数据库转储进行版本控制。

使用--skip-extended-insert,所以每条记录都在自己的行上,它可以很好地跟踪更改。它还允许我从历史中提取旧版本的数据库并导入它们。

有没有办法告诉 git 忽略某些行或包含某些模式的行?

4

2 回答 2

8

Git 是基于文件的,它不会修改跟踪文件的内容来派生差异。

可能的替代方案

去除杂物

不要在您不关心的数据库转储中包含表/数据。如果它不存在造成差异,则无需采取额外步骤来忽略/纠正它。

因此,例如,如果问题是您不想备份的已删除文章,请将它们从备份过程中删除:

mysqldump -c -w "articles.deleted IS NULL" articles > backup.sql 

后期过程

后处理数据库转储以删除您不关心的内容。例如,这是我使用的 db dump 帮助程序脚本的摘录:

#!/bin/bash
mysqldump -dRC --skip-dump-date --skip-add-drop-table --default-character-set=utf8 database $@ > schema.sql
sed -i 's/ AUTO_INCREMENT=[0-9]\+//' schema.sql

此示例(仅用于说明)从 create table 语句中删除自动增量值,以便它们不会在(版本控制的)schema.sql 文件中产生差异。

于 2012-09-12T08:00:06.393 回答
1

如果 git 不能这样做,我看到的两个解决方案是:

  1. 修改我用来转储数据库的脚本以删除与版本控制无关的内容。(缺点:删除其中一些内容可能会导致转储不再可用于导入)

  2. 将每个数据库转储存储在其他地方(可能以某种方式在挂钩中由 commitID 命名)并版本控制修改后的版本。例如,,cat dump.sql | grep -v "_session" >> dump.sql但如果我可以将这样的 grep 添加到某个地方的 git,那将是理想的。

于 2012-09-12T06:53:13.090 回答