Git获得工作副本SHA

Git获得工作副本SHA,git,version-control,Git,Version Control,我有一份包含 master(生产就绪) 发展(合理稳定的发展) 分支机构) 我们正在与功能分支合作,并大体上遵循 我们有相当多的生产服务器正在运行一个特定的SHA/commit of master,它们并不都运行同一个服务器,因为不同的客户端对更新有不同的需求 这些客户机也有测试服务器,他们喜欢在这些服务器上试用开发分支的新功能。这是我的头。但通常情况下,我们会在开发过程中做出更稳健的承诺,我们会做出一些额外的努力,确保软件准备好让客户看到(因此是Alpha/Beta版本,而不是原始开发版本

我有一份包含

  • master(生产就绪)
  • 发展(合理稳定的发展) 分支机构)
我们正在与功能分支合作,并大体上遵循

我们有相当多的生产服务器正在运行一个特定的SHA/commit of master,它们并不都运行同一个服务器,因为不同的客户端对更新有不同的需求

这些客户机也有测试服务器,他们喜欢在这些服务器上试用开发分支的新功能。这是我的头。但通常情况下,我们会在开发过程中做出更稳健的承诺,我们会做出一些额外的努力,确保软件准备好让客户看到(因此是Alpha/Beta版本,而不是原始开发版本)

因为我们有相当多的服务器,所以我们有自动部署脚本,可以将特定的提交部署到服务器

在原始git命令中,它类似于以下内容(非常简化)

日期X

客户端A测试服务器(已在开发分支上):

如果我使用 git-rev解析头

它会给我999

我想要900英镑

是否有git命令提供签出文件的修订版本

背景

我们最近已经从Subversion迁移到Git,所以这个问题受到Subversion中以前的实践以及对Git如何工作的可能误解的影响

对于客户端“demo/test”服务器,我们以前使用修订号作为标记,而不是在Subversion中实际标记(因为为每个客户端安装标记将导致我们有100个标记)。作为给定“修订/提交/标记”部署的一部分,此修订已在版本文件中盖章

现在我们已经转向git,客户仍然要求频繁更新他们的“演示/测试”系统。我们不希望跟踪“demo/test”系统的更新作为标记/发布,但希望继续使用“revision/SHA”作为标记

在版本文件中加盖版本戳时,我们不需要从部署脚本的参数输入中获取此值,因为部署脚本不是“事务安全”的,并且致命错误可能会在一个版本中离开存储库,版本文件声明另一个版本。因此,为了确保版本文件报告了文件系统上文件的实际“版本”,我们之前要求版本控制系统给我们提供当前的“版本号”


这个问题是问如何在Git中实现这一点。

有许多方法可以实现您希望实现的目标。可能最“古怪”的做法是使用标签,这样做很有意义。根据您的描述,不同的客户端正在运行不同的软件“版本”(每个版本由SHA标识)

任何试图在其他地方记录SHA的尝试都可能导致文件腐烂、纸屑丢失等。标记允许您将“这是ALPHA_BETA_试用版_1”的信息与git存储库中的SHA紧密关联。这样,随着时间的推移,当其他机器/用户克隆或获取更新时,它会随着代码一起移动。在单行日志中查找相关的提交要容易得多

因此

清楚地标记您的上游(客户端从其克隆)以供所有人查看

如果你真的需要SHA,那么

$ git show-ref ALPHA_BETA_TRIAL_1
这就是一切

相反,如果您将修订信息记录在提交消息中,则可以使用

$ git log --grep="Revision\:" --oneline --decorate

只获取提交消息中字符串为“Revision:”的提交日志。“oneline”和“decoration”命令将提供一个很好的密集日志输出,它为每个符合模式的提交提供简短的SHA、提交摘要和任何相关标记。

如果我正确解释了这个问题,那么您使用的是
git checkout$SPECIFIC\u ALPHA\u BETA\u SHA-。
是一个未记录的合并,使用合并策略“覆盖上游历史记录中的每个当前文件,同时忽略其中的删除”。Git对于这种策略没有自己的名字,那又怎样?这很容易,你已经在做了,唯一剩下的就是正确地记录它:

# Merge from $SPECIFIC_ALPHA_BETA_SHA using our own merge strategy:
git merge -s ours --no-commit $SPECIFIC_ALPHA_BETA_SHA

# our merge strategy:
git checkout $SPECIFIC_ALPHA_BETA_SHA -- .

# commit the result
git commit -m "Incorporating upstream"
现在git的工具包总是知道在哪里查找相关的提交

在一组非常流行的日志选项上为自己节省一些输入,这样做吗

git config --global alias.lgdo 'log --graph --decorate --oneline'
--global
不构成系统范围的别名,只有您自己,但您可以在任何地方使用它)

列出影响签出路径内容的提交的各种方法:

git lgdo -1 --no-merges -- path/to/file  # last ordinary commit affecting path
git lgdo --no-merges -- path/to/file     # all ordinary commits affecting path
git lgdo -- path/to/file                 # above, plus full merge history

# ordinary commits as above plus all searched commits w/ branch or tag names
git lgdo --no-merges --simplify-by-decoration -- path/to/file

虽然这仅仅是你追踪内容变化的一个开始,但我认为其中的一个或多个将在这里发挥作用。

对于一种可能更大的可能性,即每个客户都在其中一个上游分支的基础上维护一个私人分支,您不希望使用git-pull--rebase,因为它会在获取的分支的顶端重新设置基址。相反

git fetch                             # just fetch
git rebase $SPECIFIC_ALPHA_BETA_SHA   # rebase to specific stable commit
git merge-base @ @{u}                 # show where my history meets upstream's
用最后一个命令来吸引一点爱好者你可以

git log --oneline --decorate -1 $(git merge-base @ @{u})

这将向您显示合并库的提交主题以及该提交上的任何标记或其他引用。

我只是想根据这里的输入,在经过一些尝试和错误之后,分享一下对我们有用的东西

在单个客户机服务器上,当我们想要针对构建脚本的特定修订时,我们在该服务器上创建一个新的“本地”分支

如果我们感兴趣的修订/提交是7d65769ae9ba4ac9f92349feca8be3c70aacfcd6,那么我们运行以下命令

git checkout -b 7d65769ae9ba4ac9f92349feca8be3c70aacfcd6 7d65769ae9ba4ac9f92349feca8be3c70aacfcd6
这为我们提供了一个最新版本号为7d65769ae9ba4ac9f92349feca8be3c70aacfcd6的本地分支机构

正在运行

git rev-parse --abbrev-ref HEAD
返回预期的修订/提交(7d65769ae9ba4ac9f92349feca8be3c70aacfcd6-显然),以便运行生成脚本。我们不添加任何远程跟踪(因为没有远程等效分支,并且我们不将此本地分支推送到源站),因此我们不会用分支o污染远程/源站
git fetch                             # just fetch
git rebase $SPECIFIC_ALPHA_BETA_SHA   # rebase to specific stable commit
git merge-base @ @{u}                 # show where my history meets upstream's
git log --oneline --decorate -1 $(git merge-base @ @{u})
git checkout -b 7d65769ae9ba4ac9f92349feca8be3c70aacfcd6 7d65769ae9ba4ac9f92349feca8be3c70aacfcd6
git rev-parse --abbrev-ref HEAD
git checkout -b <commitSHA> <commitSHA>
git rev-parse --abbrev-ref
svn up -r <revisionNumber>
svn info -R | grep "Revision\:" | sort -k2nr | head -n1
(get revision info recursively, order by revision number desc, limit 1)