【问题标题】:How to automatically invoke a script before a git add?如何在 git add 之前自动调用脚本?
【发布时间】:2013-09-18 16:46:59
【问题描述】:

这是我的用例:我在我的 Git 存储库中提交 PNG 和其他内容。我想对我想提交的每个 PNG 应用一个特定的过程,这是我最终要提交的过程的结果(潜在的修改后的 PNG)。

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

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

如果你有线索……即使线索是要改变我的流程想法。

【问题讨论】:

    标签: git hook gitattributes


    【解决方案1】:

    您可能需要考虑使用 smudge & clean 过滤器,在 git add 期间应用 clean,在结帐期间应用 smudge。这些可以按文件类型分配。查看“git attributes(5)”手册页和Git SCM book : Git Attributes

    【讨论】:

    • 嗨@philip-oakley 感谢您的回复,您的解决方案似乎是正确的:文件暂存时运行“干净”过滤器。我会尝试使用它并告诉你它是否可以!
    • 解决方案还可以,但重写文件很好,但处理图像有点复杂:) 我需要进一步调查
    • 由于页面比较长,这里总结一下方法会很有用(我试过用了,没用)。
    • @SephReed 爆炸.zips 可能会变得复杂,因为它们可能不会以相同的方式重新组合(拉链的一个已知问题),但如果只是为了获取索引/dir 列出 zip 内容然后这并不难。此外,如果它已爆炸,则当您专注于单个文件时,您需要知道还有什么需要返回。 Plus zips 不能很好地压缩多个相似的文件(所以我被告知)。
    • @SephReed “来回转换的文件?”绝对地。这就是涂抹/清洁过滤器对的全部目的。 juandebravo.com/2017/12/02/git-filter-smudge-and-clean 给出了一个用法示例。
    【解决方案2】:

    改用clean 可能有充分的理由,但实际上没有什么可以阻止您在pre-commit 挂钩期间重新添加文件,我认为这更直观一些。

    您的pre-commit 看起来像:

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

    然后提交将照常继续。如果您想变得花哨,可以在压缩出现问题时在其中输入exit 1,它将停止提交。

    【讨论】:

    • 这似乎没有按预期工作:预处理已完成,但git add 注册任何更改似乎为时已晚(因此,更改似乎被冻结在此脚本之前)。我使用 generates 添加的文件的脚本对此进行了测试,并且在文件被删除后完成了提交:提交消息表明它已被删除(尽管已再次生成并 git “添加”) .
    • 听起来您忘记考虑处理时间了。我想我应该在原文中提到它,但是您需要一种方法来判断您的处理何时完成并且在此之前不要git add。如果git add 在更改之前命中,您显然不会注册任何更改。
    • git add 仅在预处理后运行。现在,预处理处理了一个 .ipynb 文件,但创建了一个 .py 文件(版本化),没有使用 git 通常要求的标准输入,所以也许这就是 git 没有看到文件已更改的原因。
    【解决方案3】:

    我使用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 获得了图像任务代码。)

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 2010-09-25
      • 2010-11-23
      • 2012-12-14
      • 1970-01-01
      • 2014-05-25
      相关资源
      最近更新 更多