git - 在 Git 中获取当前签出的完整参考名称
问题描述
我需要一个命令来返回我当前签出的修订的完整参考名称。或者尽可能接近这个。如果仅 git(用于跨平台目的),则大加。
“完整的参考名称”是指例如refs/tags/my-tag
, refs/heads/my-branch
.
例子:
git checkout master
magic command
# => /refs/heads/master
git checkout v1.0.0
magic command
# => /refs/tags/v1.0.0
git checkout 86742545e8152a8fbf31eafa55eb573042f61f5d
magic command
# =>
几点参考:
- 实际上,我认为这不可能 100% 准确,因为(据我了解 git)检查标签和特定哈希之间没有区别。即
.git/HEAD
在这两种情况下都显示了哈希值。 git show-ref
显示所有引用和相应的提交哈希git symbolic-ref HEAD
适用于分支,-q
如果您不在分支上,它不会失败git describe --tags --exact-match
有点适用于标签,但你需要在它前面加上refs/tags
stderr 并去掉它
有关的:
对于我正在寻找的东西,我能找到的一切似乎都太复杂了。
解决方案
您可能想要git describe
,也许带有一些标志,也许带有一些后处理。请参阅下面的详细信息。
我不完全确定您要解决的实际问题是:
哈希 ID 是此提交的永久名称。就这样
git rev-parse HEAD
,你就拥有了。当前的分支名称就是
git symbolic-ref HEAD
得到的。如果没有当前分支名称,则会产生错误,每当您使用git checkout
切换到分离的 HEAD时都会出现这种情况。那包含着:- 检出非分支名称(例如,标签名称或远程跟踪名称),
--detach
与分支名称一起使用,并且- 使用原始哈希 ID(当然)。
请注意,分支名称存储一个提交哈希 ID,除了在“未出生分支”上的一些特殊情况,在这种情况下,分支名称不存在,即使它是当前分支名称。这种有点令人讨厌的状态是必要的,因为分支名称必须包含现有提交的哈希 ID,并且在一个新的、完全空的存储库中,没有现有的提交,但您开始使用 branch master
。
如果您要解决的问题是:“告诉我用户输入了什么命令以进入HEAD
我现在所处的状态,无论是分离的还是附加的”, Git不会为您保存。您得到的最接近的是HEAD
reflog 中的条目。此 reflog 不需要存在。另一个需要查看的地方是shell(命令行解释器)保存的历史记录:如果该历史记录存在,它可能包含用户输入的确切命令,即使该命令是别名。
如果您要解决的问题是:“提供一个对人类有用/可读的名称,这将(总是|当前)识别这个确切的提交”,那么没有正确的答案,但您最接近的方法是让您的拥有当前提交哈希 ID 的新标签。您可以来的第二个最接近的方法,它非常有用,是使用git describe
(它有很多标志来调整其输出)的输出。请注意,使用分支名称只会识别相同的提交,直到分支名称继续识别其他提交,这会定期发生。
推荐阅读
- java - Spring Boot Tomcat 不会在特定端口上启动
- css - Css动画:用颜色从左到右填充一个div
- r - R中的F_meas中的错误'输入数据必须具有相同的两个级别'?
- access-token - 无法使用新的基本 Instagram API 获取 Instagram 访问令牌
- flutter - ChangeNotifierProxyProvider 构建器与更新问题
- sapui5 - 必需的模块缺少方法
- python - 定义 DQN 的输出大小
- flutter - Flutter TextField 输入在保存/完成后不会消失
- python - 有没有办法在 python 中为不和谐机器人导入带有装饰器的函数
- rspec - Rails 5.0 升级中的 Rails 功能测试失败