2017-07-06 113 views
0

我需要創建一個通用腳本,它將在保存時將這些信息添加到每個文件中,如AtomWebStorm等文本編輯器。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 

在添加一個表的命令,有一個缺點,首先除了文件後,此表不再適用於後來被創建或其中的表已被刪除的文件。

而第二個問題是動態更新文件中的信息。

# 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