2013-11-28 91 views
2

在我的项目中有一个存储所有DB更新的目录(即db/updates /)。每个更新都在单个文件中(即update_1.sql,update_2.sql等)。 发布时,我需要自上次修订(存储在数据库)后添加/更新的文件范围。 现在我做了以下的方法:Git:如何在特定修订版本之间获取文件

# pull changes  
git pull origin branch --force 

# make patch  
git diff $last_revision -- ./db/updates > ./PATCH 

# remove all files in directory /db/updates  
rm -rf ./db/updates/* 

# apply changes  
git apply --ignore-whitespace --inaccurate-eof ./PATCH 

它工作正常,但也有情况下,当它失败。 如果有变化的文件之间的文件,其中有犯添加了一个补丁将失败,错误 错误犯B和C:DB /更新/ update_xxx.sql:没有这样的文件或目录

如何忽略失踪文件?我会使用--diff过滤= A,同时创造补丁,但是这会不顾一切的变化是在需要的地方版本B和C之间COMMITED

回答

1

尝试过滤只添加的文件:

git diff --diff-filter=A $last_revision -- ./db/updates > ./PATCH 

那只会给你补丁中新增的文件,而不是修改的文件。

多见于“Filter git diff by type of change”:
要获得新修改的文件:

git diff --diff-filter=ACMR $last_revision -- ./db/updates > ./PATCH 
+0

正如我在我的文章中提到的,这不是一个选项。我需要修改以包含在补丁中。 – user3044784

+0

@ user3044784没问题:您可以通过新的*和*修改文件进行过滤:我编辑了答案。 – VonC

1

嗯,就是要添加/修改文件,而无需补丁等任何问题,更简单的方法:

# pull changes 
git pull origin branch --force 

# get modified files list since last revision 
modified=`git diff --name-only last_revision -- ./db/updates` 

# copy added/modified to another folder 
for sql in $modified; do 
    cp $sql ./temp/ 
done 
+0

这也可以工作。比我的答案简单,做得好。 +1 – VonC

相关问题