打印版本,作者,日期修改为文件

时间:2015-09-08 08:45:45

标签: git bash deployment version-control

我以前使用SVN开发Tcl / Python脚本进行版本控制;现在我正在使用git。使用SVN我使用关键字将日期修改和其他信息打印到文件头,但git不提供这种功能。我已经阅读了这个原因并且我同意在大多数情况下这个功能并不是必需的。如果你可以从git本身获取信息,为什么要将这些信息打印到文件中?

但是如果我使用git版本控制开发脚本会怎么样,但我想让那些不使用git的只读用户可以使用它?在这种情况下,文件需要一些信息来告诉用户它是什么版本,也许是谁修改它以及何时修改它。 SVN关键字提供了这个功能,但git没有一个简单的方法来做到这一点,而没有编写一些复杂的预提交钩子,无论如何都会使工作副本变脏。

有没有人有类似的用例,以及使用git做到这一点的方法?

3 个答案:

答案 0 :(得分:1)

所以,如果有人有兴趣,我会在看下面的评论后想出一个解决方案。我已经编写了一个bash脚本,使用$gitFilesgit archive位置发布$publishFolder文件夹中包含的文件。然后,脚本使用git log获取每个文件的信息,并使用sed s/findstr/repstr/ $file打印到每个文件头。

#!/bin/bash

publishFolder="./Release"
gitFiles="./PythonFiles"

updateFindStr="\\\$Last Update[^\\$]*\\$"
commentFindStr="\\\$Comment[^\\$]*\\$"
hashFindStr="\\\$Hash[^\\$]*\\$"

# Archive the whole folder
folderHash=$(git log -1 --pretty=format:"%H" $gitFiles)
git archive $folderHash --format tar $gitFiles > $publishFolder/archive.tar

# Unpack the tar file and delete it
tar xf $publishFolder/archive.tar -C $publishFolder
rm $publishFolder/archive.tar

# Loop through all files in the gitfiles folder and write git info to the published files
for file in $(ls $gitFiles/*.*)

do
    echo "Publishing $(basename $file)..."

    # Grab the git info and save as string in format date;author;comment;hash
    gitInfo=$(git log -1 --pretty=format:"%cd;%an;%s;%H" --date=short $file)

    # Split the string and save to separate variables
    IFS=";" read date author comment hash <<< "$gitInfo"

    # build update, comment and hash strings
    updateRepStr="\\\$Last Update: ${date} by ${author} \\$"
    commentRepStr="\\\$Comment: ${comment} \\$"
    hashRepStr="\\\$Hash: ${hash} \\$"

    # Write git hash and info into the new file
    sed -i "s/${updateFindStr}/${updateRepStr}/; s/${commentFindStr}/${commentRepStr}/; s/${hashFindStr}/${hashRepStr}/" $publishFolder${file:1}

done

所以我从这样的文件头开始:

# ------------------------------------------------------------------------------
# PYTHONSCRIPT:     myfile.py
# ------------------------------------------------------------------------------
# Project:      n/a
# Created by:   user on 22/7/2015
# $Last Update: $
# $Comment:     $
# $Hash:        $
# ------------------------------------------------------------------------------

我最终得到一个发布的文件,其标题看起来像这样,这就是我想要的:)

# ------------------------------------------------------------------------------
# PYTHONSCRIPT:     myfile.py
# ------------------------------------------------------------------------------
# Project:      n/a
# Created by:   user on 22/7/2015
# $Last Update: 2015-09-09 by user $
# $Comment: Added comment keyword $
# $Hash: ec56f527333c0c0af98c2ed3ab3395c6c8a50624 $
# ------------------------------------------------------------------------------

答案 1 :(得分:1)

由于你想要在git中模拟类似于SVN $ Header $的东西,这里有一个实现这个功能的解决方案:

  1. 添加以下预提交挂钩:

    #!/bin/sh
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 .filters/keywords --
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 git add -u -v --
    
  2. 添加以下commit-msg hook:

    #!/bin/sh
    awk '!/^[[:space:]]*(#|$)/{exit f++}END{exit !f}' "$1" && exit
    # NOTREACHED unless commit was aborted
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 .filters/keywords -d --
    git diff --cached --name-only -z --diff-filter=ACM |
            xargs -r0 git add -u -v --
    
  3. 下载“.filters / fraubsd-keywords”,但将文件重命名为“关键字”:

    https://raw.githubusercontent.com/freebsdfrau/FrauBSD/master/.filters/fraubsd-keywords

  4. 修改“关键字”,在顶部的配置部分进行更改:

    • FrauBSD to Header
    • _FrauBSD to _Header
  5. 在此之后,每次执行git commit时,文字$Header$和/或$Header: ... $都会被翻译为$Header: file YYYY-MM-DD HH:MM:SS GMTOFFSET committer $

    注意:您可能必须修改“关键字”脚本的一小部分,以便对或多或少类型的文件进行操作。在撰写本文时,它仅对“ASCII文本”或“shell脚本”文件进行操作。

答案 2 :(得分:0)

这取决于您打算如何发布文件(用户从您的存储库下载它们,例如从Github或Bitbucket下载),或者您是否准备了可从您的站点下载的软件包。您可以在提交之前添加信息&#34;写入&#34;到存储库(即使用pre-commit挂钩)或从存储库中签出文件时(即使用涂抹/清理过滤器,请参阅http://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes)。

另一种方法是使用自定义脚本来检出文件,从git获取信息并在文件发布之前在文件中插入相关部分。