如何在git add之前自动调用脚本?

时间:2013-09-18 16:46:59

标签: git hook gitattributes

这是我的用例:我在我的Git仓库中提交了PNG和其他内容。我想对我想提交的每个PNG应用一个特定的进程,这是我最终想要提交的进程的结果(可能修改的PNG)。

一开始我想到了一个钩子(比如pre-commit),但它有点奇怪,因为这个过程会改变文件,所以我需要重新添加它!根据我read的内容,没有pre-add钩子(或类似的东西)。

可能是一个解决方案是创建一个git别名?但我不想改变 - 太多 - 人们的工作方式,我正在寻找一种平稳透明的方式。

如果你有线索......即使线索是改变我的过程想法。

3 个答案:

答案 0 :(得分:5)

你可能想要考虑涂抹&清理过滤器,在git add期间应用clean,在结帐时涂抹污迹。这些可以按文件类型分配。查看'git attributes(5)'手册页和Git SCM book : Git Attributes

答案 1 :(得分:5)

可能有充分的理由使用clean,但实际上并没有阻止您在pre-commit挂钩期间重新添加文件,这在某种程度上更直观我的意见。

您的pre-commit看起来像是:

*run your PNG processing here* (after processing completes) git add *.png

然后提交将继续照常进行。如果你想获得幻想,当压缩出现问题时你可以在其中抛出exit 1,它将停止提交。

答案 2 :(得分:0)

我使用gulpgulp-git做了与disso类似的事情。

var git = require('gulp-git')

// ... other tasks

gulp.task('add', function(){
  return gulp.src('cdn/**')
    .pipe(git.add())
})

然后在其他所有内容的末尾调用此添加任务。然后我用gulp设置了一个预提交钩子。像魅力一样。

因此,在您的情况下,完整文件可能类似于:

var gulp = require('gulp')
var $ = require('gulp-load-plugins')()
var runSequence = require('run-sequence')

gulp.task('default', function () {
  return runSequence(
    'images',
    'add'
    )
})

gulp.task('images', function() {
  return gulp.src('app/images/**/*')
    .pipe($.cache($.imagemin({
      progressive: true,
      interlaced: true
    })))
    .pipe(gulp.dest('dist/images'))
})

gulp.task('add', function(){
  return gulp.src('dist/**')
    .pipe($.git.add())
})

(请注意,我还没有测试过它......我从Google获得了图片任务代码。)