首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GIT获取当前状态下每个文件的第一个标记。

GIT获取当前状态下每个文件的第一个标记。
EN

Stack Overflow用户
提问于 2022-05-06 13:17:34
回答 2查看 128关注 0票数 2

为了比较多个版本之间的单个文件,我希望跟踪每个文件中文件更改的第一个版本。

我希望记录当前状态下git文件的第一个标记,这是自上次更改以来的。

例如,我有两个文件:

代码语言:javascript
复制
* file1  - aadfed
* file2  - aadfed

每次构建发行版时,我都会在当前提交中添加一个标记,这样我就可以轻松地从GIT重新创建发布。所以,在第一个版本之后,这将是标记

代码语言:javascript
复制
* file1  - aadfed - [release-1]
* file2  - aadfed - [release-1]

假设我更改了file1,生成了一个包含file1的新提交。然后构建一个发行版,用release-2标记提交。

这是我目前的状况:

代码语言:javascript
复制
* file1  - bebebe - [release-2]
* file2  - aadfed - [release-1][release-2]

我想要以当前的形式有效地告诉第一个标记是在哪里出现的。

目前执行情况

我现在要做的是:

代码语言:javascript
复制
git describe --contains `git rev-list HEAD file1`
git describe --contains `git rev-list HEAD file2`

(实际上,git describe在我运行的shell脚本中,如下所示:)

代码语言:javascript
复制
find * -exec bash getgitinfo.sh {} \;

getgitinfo.sh:

代码语言:javascript
复制
COMMIT=$(git rev-list -1 HEAD $1)
if [ "${COMMIT}x" != "x" ]; 
then
  RELEASE=$(git describe --contains $COMMIT)
  echo $1,$RELEASE
fi 

虽然这样很管用,但它觉得应该有更好的方法。有什么暗示吗?

期望产出:

代码语言:javascript
复制
 file1,release2
 file2,release1
EN

回答 2

Stack Overflow用户

发布于 2022-05-14 23:47:56

我不知道有什么更好的方法来做你想做的事。不过,如果您发布了输出以及您希望输出的内容,则可能会有所帮助。

如果只是输入过多,git别名可以解决这个问题。转到~/.gitconfig并添加:

代码语言:javascript
复制
[alias]
    file = "!git describe --contains `git rev-list HEAD \"$1\"` #"

现在您应该只需键入:

代码语言:javascript
复制
git file file2
票数 1
EN

Stack Overflow用户

发布于 2022-05-16 09:32:55

批量处理您的信息获取和整理,您试图使用一个方便的命令的方式,它不是为,所以它是错误的权衡。

与核心对话,这就是你如何建立新的便利。

所有标记名和它们以高效生成、易于解析的格式解析的提交:

代码语言:javascript
复制
git for-each-ref refs/tags --format='%(refname)^{commit} %(refname)' \
| git cat-file --batch-check=$'%(objectname)\t%(rest)'

最新的主线承诺触摸每个当前文件:

代码语言:javascript
复制
git log --first-parent -m --pretty=format:%H --name-status \
| awk ' NF==1{commit=$1}
        NF==2 && !seen[$2]++ { print commit,$2 } ' FS=$'\t'

整理:

代码语言:javascript
复制
( git for-each-ref refs/tags --format='%(refname)^{commit} %(refname:short)' \
  | git cat-file --batch-check=$'tag\t%(objectname)\t%(rest)'
  git log --first-parent -m --pretty=format:%H --name-status --no-renames
) | awk ' $1=="tag" { tag[$2]=$3; next }
          NF==1 && tag[$1] { containing=tag[$1] }
          NF==2 && !seen[$2]++ && $1!="D" { print containing, $2 }
' FS=$'\t' OFS=$'\t'

当然还有“品尝季节”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72142105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档