2013-02-01 8 views
8

git pre-commitフックスクリプトを書こうとしていますが、変更されたファイルの先頭にコミットの日付を書き込む必要があります。私の問題は、以前のコミットに変更されたファイルを追加できないことです。私がgitを呼び出しようとすると、再帰的に実行されます。どのように私は変更されたファイルの最後に修正の時間を追加するスクリプトを書くことができますか?Gitフック、コミットファイルを変更する

マイコード:あなたはにコミット修正することはできません

#!/bin/bash 

files_modified=`git diff-index --name-only HEAD` 

for f in $files_modified; do 
    if [[ $f == *.groovy ]]; then 
     $line = $(head -1 f) 
     if [[ $line == "/%%*" ]]; 
     then 
      sed -i 1d 
     fi 
     echo "/%% " + $(date +"%m_%d_%Y") + " %%\\" >> f 
     git add f 
    fi 
done 
git commit --amend #recursive 
exit 

答えて

2

はフックをコミットします。
あなたがしていることは、キーワード拡張メカニズムに似ています.Git(またはDVCS)のベストプラクティスではありません。「To put the prefix ?<revision-number> to codes by Git/Svn」で説明しています。

他のアプローチとしては、(当時とコミット)別のあなたがそれで必要な情報を含むファイルを生成

2

、あなたソルジャーをしたことがほとんどありました。

#!/bin/bash 
    files_modified=`git diff --cache --name-only --diff-filter=ACM` 
      ### fix: use current branch; cached; and only files 
    for f in $files_modified; do ### broken: if space in filename(s) 
     if [[ $f == *.groovy ]]; then 
      line=$(head -1 $f) ### fix: forgot a $ before f 
      if [[ $line == "/%%*" ]]; 
      then 
       sed -i 1d "$f" ### fix: forgot file argument 
      fi 
      echo "/%% " + $(date +"%m_%d_%Y") + " %%\\" >> $f 
        ### fix: forgot a $ before f 
      git add -u $f ### fix: forgot a $ before f 
     fi 
    done 
    ### undesired ### git commit --amend #recursive 
    ### unneeded ### exit 

ただし、私はあなたの実装にいくつかの問題があることに気付きました。ファイルの先頭から "/ %% *"と一致する行を削除し、新しい行を最後に追加します。これを実行するたびに、ファイルの末尾に新しい/%% mm_dd_YYYY %%\行が永久に追加されます。それはあなたが望むものではないかもしれません(1000コミット後、空のファイルは1000行あります)。私はあなたがやっていたことは、既存のラインを置き換えることだったと思います。この場合、一致する行を置換するsed変換が機能します。ファイルの最初の行は前の時点で(/%% ... %%\が、それが現在の日付/時刻に更新されて一致した場合

#!/bin/sh 
    TMPFILE="/tmp/${0##*/}.$$" 
    for f in $(git diff --cached --name-only --diff-filter=ACM); do 
      # XXX broken: if space in filename(s) 
      case "$f" in 
      *.groovy) : fall through ;; 
      *) continue 
      esac 
      cp "$f" "$TMPFILE" || continue 
      awk -v new="/%% $(date +%m_%d_%Y) %%\\" \ 
        'NR==1{sub("^/%% .* %%\\\\$",new)}1' \ 
        < "$TMPFILE" > "$f" 
      git add -u -- "$f" 
    done 

:ここ

は、私はあなたが何を望むかに近づくと思うのレシピですコミットフック)。

しかし、これは単純にどのように行うことができるかを説明するためのものです。それは実際には完全な解決策ではありません。上記のスクリプトは、名前、二重引用符、バックスラッシュ、タブなどのスペースを含むファイルでは機能しません。完全なソリューションのために

  1. 使用以下、プリコミットフック:

    #!/bin/sh 
    git diff --cached --name-only -z --diff-filter=ACM | 
         xargs -r0 .filters/myfilter 
    
  2. すると、次の内容で ".filters/myFilterを" を作成します。

    #!/bin/sh 
    TMPFILE="/tmp/${0##*/}.$$" 
    for f in "[email protected]"; do ### the only difference from above recipe 
         case "$f" in 
         *.groovy) : fall through ;; 
         *) continue 
         esac 
         cp "$f" "$TMPFILE" || continue 
         awk -v new="/%% $(date +%m_%d_%Y) %%\\" \ 
           'NR==1{sub("^/%% .* %%\\\\$",new)}1' \ 
           < "$TMPFILE" > "$f" 
         git add -u -- "$f" 
    done 
    

上記の実装あなたがそれに投げるファイル名を扱うことができます。

関連する問題