Can you change a file content during git commit?

前端 未结 2 1497
猫巷女王i
猫巷女王i 2020-11-28 10:54

One of the things I keep in my open novel in GitHub is a list of words I would like to set automatically the first line, which is the number of words in the dictionary. My f

相关标签:
2条回答
  • 2020-11-28 11:34

    The actual commit stuck in by git commit is whatever is in the index once the pre-commit hook finishes. This means that you can change files in the pre-commit hook, as long as you git add them too.

    Here's my example pre-commit hook, modified from the .sample:

    #!/bin/sh
    #
    # An example hook script to verify what is about to be committed.
    # [snipped much of what used to be in it, added this --
    #  make sure you take out the exec of git diff-index!]
    
    num=$(cat zorg)
    num=$(expr 0$num + 1)
    echo $num > zorg
    git add zorg
    echo "updated zorg to $num"
    exit 0
    

    and then:

    $ git commit -m dink
    updated zorg to 3
    [master 76eeefc] dink
     1 file changed, 1 insertion(+), 1 deletion(-)
    

    But note a minor flaw (won't apply to your case):

    $ git commit
    git commit
    updated zorg to 4
    # On branch master
    # Untracked files:
    [snip]
    nothing added to commit but untracked files present (use "git add" to track)
    $ git commit
    updated zorg to 5
    # Please enter the commit message for your changes. Lines starting
    [snip - I quit editor without changing anything]
    Aborting commit due to empty commit message.
    $ git commit
    updated zorg to 6
    # Please enter the commit message for your changes. Lines starting
    

    Basically, because the pre-commit hook updates and git adds, the file keeps incrementing even though I'm not actually doing the commit, here.

    0 讨论(0)
  • 2020-11-28 11:35

    It turns out you can run "hooks" - they are actually handled by another mechanism - when staging files (at git add time) :

    https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#_keyword_expansion

    (scroll down a bit to the "smudge" and "clean" diagrams)

    Here is what I understood :

    1. edit the .gitattributes, and create rules for the files which should trigger a dictionary update:

      novel.txt filter=updateDict

    2. Then, tell Git what the updateDict filter does on smudge (git checkout) and clean (git add):

      $ git config --global filter.updateDict.clean countWords.script

      $ git config --global filter.updateDict.smudge cat

    0 讨论(0)
提交回复
热议问题