evilmartians / lefthook

Fast and powerful Git hooks manager for any type of projects.
MIT License
4.93k stars 215 forks source link

stage_fixed (or equivalent) for changed files not originally staged #806

Open isturdy opened 2 months ago

isturdy commented 2 months ago

:zap: Summary

IIUC, currently stage_fixed only affects the files originally in the glob. I'm trying to use lefthook for code/documentation generation, and so some steps create/modify files not part of the original staged set/glob results.

Value

Allows using pre-commit for generated files (e.g. documentation)

Behavior and configuration changes

For a silly example, consider a hook that duplicates files:

pre-commit:
  commands:
    clone:
      stage_fixed: true
      glob: "*.txt"
      run: cp {staged_files} backup

I initially expected that this would commit both the manually-created file and its backup, but instead it commits the original file and creates the backup but does not stage/commit it. I would like to see a variant of stage_fixed that also adds any files not originally staged for the commit that change during the command.

isturdy commented 2 months ago

Update: I had thought of using git add within the command but found it unreliable; apparently that stemmed from running it inside docker, and moving it outside fixed that. (On the other hand, I've also found that stage_fixed doesn't seem to work reliably for files changed by something running in Docker.)

mrexox commented 2 months ago

I suggest you to use git add in your command, like this:

pre-commit:
  commands:
    clone:
      glob: "*.txt"
      run: cp {staged_files} backup && git add backup/*

Staging everything in lefthook is hard to control and you may surprise to commit something you didn't want to. So, explicitly adding files with && git add ... is an options. What issues did you meet when using it?

isturdy commented 2 months ago

Running git add from a script running in Docker consistently errored saying that .git/index.lock already exists, despite no other git processes running.

mrexox commented 2 months ago

Could you provide some example of Dockerfile and lefthook.yml, so I could try reproducing this?