在git提交期间,您可以更改文件内容吗?

在git提交期间,您可以更改文件内容吗?,git,hook,commit,Git,Hook,Commit,我在字典中保存的一件事是,我想自动设置第一行,即字典中的单词数。我的第一个选择是编写一个预提交钩子,它读取文件、计算字数、重写第一行并再次写回。这是密码 PRE_COMMIT { my ($git) = @_; my $branch = $git->command(qw/rev-parse --abbrev-ref HEAD/); say "Pre-commit hook in $branch"; if ( $branch =~ /master/ ) { my

我在字典中保存的一件事是,我想自动设置第一行,即字典中的单词数。我的第一个选择是编写一个预提交钩子,它读取文件、计算字数、重写第一行并再次写回。这是密码

PRE_COMMIT {
  my ($git) = @_;
  my $branch =  $git->command(qw/rev-parse --abbrev-ref HEAD/);
  say "Pre-commit hook in $branch";
  if ( $branch =~ /master/ ) {
     my $changed = $git->command(qw/show --name-status/);
     my @changed_files = ($changed =~ /\s\w\s+(\S+)/g);
     if ( $words ~~ @changed_files ) {
       my @words_content = read_file( $words );
       say "I have $#words_content words";
       $words_content[0] = "$#words_content\n";
       write_file( $words, @words_content );
     }
   }
};
但是,由于该文件已经被暂存,我得到了这个错误

错误:您对以下文件的本地更改将被覆盖 通过结帐: text/words.dic 请提交或隐藏您的更改 在切换分支之前。 流产


将其作为提交后挂钩并在下一次提交时对其进行更改是否更好?或者做一些完全不同的事情?一般的问题是:如果您想在提交过程中处理和更改文件的内容,正确的方法是什么?

git commit的实际提交是预提交钩子完成后索引中的内容。这意味着您可以在pre-commit钩子中更改文件,只要您
git也添加它们

下面是我的预提交钩子示例,根据.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
然后:

$ git commit -m dink
updated zorg to 3
[master 76eeefc] dink
 1 file changed, 1 insertion(+), 1 deletion(-)
但请注意一个小缺陷(不适用于您的案例):

基本上,因为预提交钩子会更新并且
git add
s,所以即使我没有在这里进行提交,文件也会不断增加。

事实证明,在暂存文件时(在
git add
时间),您可以运行“钩子”——它们实际上由另一种机制处理):

(向下滚动一点至“涂抹”和“清洁”图表)

以下是我的理解:

  • 编辑
    .gittributes
    ,并为应触发字典更新的文件创建规则:

    novel.txt filter=updateDict

  • 然后,告诉Git,
    updateDict
    过滤器在smudge(Git签出)和clean(Git添加)上执行的操作:

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

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


  • 基本上这是一个不同的哈克小子,对吧?按我的方式操作文件已更改,但在下一次更改之前不会提交是的。我不确定我是否真的会对这两种方法感到满意;我宁愿有一个像Makefile这样的东西来根据需要进行更新,还有一些更手动的东西。但它应该可以工作。你可以让你的脚本在你实际提交后做一个
    commit-a--amend
    。这对我来说似乎不太安全。工作树与索引之间可能会发生变化,这种情况并不少见。如果您使用git add,您将把工作树中的任何状态添加到索引中,这是不可取的。@tksfz:事实上,我不建议这样做。我只是指出它是如何工作的。有关提交日期,请参阅:
    $ 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