GIT:添加作者,创建/修改日期到文件

时间:2017-07-06 12:03:23

标签: git

我需要创建一个通用脚本,在保存文件时将这些信息添加到每个文件中,例如AtomWebStorm等文本编辑器。

添加信息:

  1. 文件创建日期;
  2. 上次更新文件的日期;
  3. 项目分支;
  4. 作者。
  5. 此表的示例 enter image description here

    以下是我使用shell创建的代码示例。

    #! /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
    

1 个答案:

答案 0 :(得分:1)

真的您是否需要在文件中提供元数据?

在文件中存储元数据通常是旧的集中式SCM的习惯 但是在git中,由于您需要在本地克隆整个repo,因此您可以直接访问所有元数据。

因此,您可以在需要时通过以下方式访问它们:

# 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拒绝发布提交而不使用标题修改文件。