2017-07-06 26 views
0

AtomまたはWebStormのようなテキストエディタのように、保存時にこの情報を各ファイルに追加する汎用スクリプトを作成する必要があります。アドオンのためGIT:作成者、日付をファイルに作成/変更

情報:

  1. ファイルの作成日。
  2. 最終更新日。
  3. プロジェクトブランチ。
  4. 著者。ここでは、このテーブルの

enter image description here

私はシェルで作成されたコードの一例です。テーブルを追加するためのコマンドで

#! /bin/bash 

# Abort if any of the commands fail 
set -e 
# Trace what gets executed. Useful for debugging. 
set -x 
# If set, the return value of a pipeline is the value of the last (rightmost) command to 
#exit with a non-zero status, or zero if all commands in the pipeline exit successfully. 
set -o pipefail 
# Treat unset variables as an error when performing parameter expansion. 
# If expansion is attempted on an unset variable, the shell prints an error message, 
# and, if not interactive, exits with a non-zero status. 
set -u 

# Created: 
DATE=$(date +%Y-%m-%d:%H:%M:%S); 
BRANCH=$(git symbolic-ref --short -q HEAD); 
GIT_USER=$(git config user.name); 
CREATED=$(echo 'created'); 

# Updated: 
DATE_U=$(git log -1 --format=%cd --date=format:%Y-%m-%d:%H:%M:%S); 
BRANCH_U=$(git symbolic-ref --short -q HEAD); 
GIT_USER_U=$(git config user.name); 
UPDATED=$(echo 'updated'); 

# Find file (js) and add table to file. 
echo "Create table in js-file..." 
if test -a $(grep created: ./development/*.js); then 
    sudo find ./development -name "*.js" -type f -exec sed -i 1i\ "/*flow*/\n/*---------------------------------------------------------\n $CREATED: $DATE | $BRANCH | $GIT_USER \n $UPDATED: $DATE_U | $BRANCH_U | $GIT_USER_U \n---------------------------------------------------------*/" {} \; 
    echo "Create table..." 
else 
    echo "Table already is exist..." 
fi 

# Find file (scss) and add to file. 
echo "Create table in scss-file..." 
if test -a $(grep created: ./development/*.scss); then 
    sudo find ./development -name "*.scss" -type f -exec sed -i 1i\ "/*---------------------------------------------------------\n $CREATED: $DATE | $BRANCH | $GIT_USER \n $UPDATED: $DATE_U | $BRANCH_U | $GIT_USER_U \n---------------------------------------------------------*/" {} \; 
    echo "Create table..." 
else 
    echo "Table already is exist..." 
fi 

、欠点は、ファイルへの最初の添加後、このテーブルは、もはや後に作成されたか、それらのテーブルが削除されたファイル上で動作し、ありません。

第2の問題は、ファイル内の情報の動的更新です。

# Updated 
echo "Update date area..." 
if test ! -a $DATE_U; 
    then 
    echo "Date is exist..." 
else 
    echo "Update date..." 
fi 

echo "Update branch area..." 
if test ! -a $BRANCH_U; 
    then 
    echo "Branch is exist..." 
else 
    echo "Update branch..." 
fi 

echo "Update user area..." 
if test ! -a $GIT_USER; 
    then 
    echo "User is exist..." 
else 
    echo "Update user..." 
fi 
+0

この情報を各ファイルで直接利用できるようにするためのユースケースは何ですか? – zigarn

+0

@zigarnこの情報は追跡に使用されます。誰がファイルをいつ変更したのですか? – Dmytro

+0

これらの情報が必要なときに適切なgitコマンドを使うことはできませんか? – zigarn

答えて

1

あなた本当にはファイルに入手可能なもののメタデータを持っている必要がありますか?

ファイルにメタデータを格納するのは、通常、古い中央集中型SCMの古い習慣です。
しかしgitでは、リポジトリ全体をローカルで複製する必要があるため、すべてのメタデータに直接アクセスできます。

あなたがそれらを必要なときですから、単に実行してそれらにアクセスすることができます

# Data of first commit of file 
git log -1 --diff-filter=A --format='%an | %aI | %h' -- path/to/file 

# Data of last commit of file 
git log -1 --format='%an | %aI | %h' -- path/to/file 

あなたが本当にあなたのファイルでそれらを取得したい場合は、推奨される方法はkeyword-expansionを使用することです(CVSやSVNをするために使用と同じように行う)。

でも、各ファイルにプレースホルダを追加する必要はありません。
プレースホルダでヘッダーを作成する場合は、ファイルをステージングするときにファイルを変更するには別のcleanフィルタを使用する必要があります(Can you change a file content during git commit?参照)。

しかし、このフィルタは、リポジトリとやりとりするすべてのgitクライアントに展開して強制的に使用する必要があります。
server-side hooksを使用して、ヘッダーのないファイルを変更する公開コミットを拒否できます。

+0

はい、これらのメタデータは異なるプロジェクトファイルに必要です。 このデータを作成するスクリプトに問題があります。 このスクリプトの仕組みを判断する必要があります。 – Dmytro

関連する問題