- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有以下简单的 git 存储库:一个分支,一些分支一个接一个提交,其中一些在提交每个分支后被标记(带有带注释的标签),然后有一天我决定要更改第一个提交(顺便说一句,没有标记,如果这有什么改变的话)。所以我跑 git rebase --interactive --root
并为初始提交标记“编辑”,更改其中的内容和 git rebase --continue
.现在我的存储库中的所有提交都已重新创建,因此它们的 sha1 已更改。但是,我创建的标签完全没有变化,仍然指向之前提交的 sha1。
是否有一种自动方法可以将标签更新为 rebase 时创建的相应提交?
有人建议使用 git filter-branch --tag-name-filter cat -- --tags
但这首先警告我我的每个标签都没有改变,然后说我的每个标签都更改为自己(相同的标签名称和相同的提交哈希)。还有,git show --tags
说标签仍然指向旧的提交。
最佳答案
从某种意义上说,为时已晚(但等一下,有好消息)。 filter-branch
代码能够调整标签,因为它在过滤过程中保留了 old-sha1 到 new-sha1 的映射。
事实上,两者都是filter-branch
和 rebase
使用相同的基本思想,即复制每个提交,通过扩展原始内容,进行任何所需的更改,然后从结果中进行新的提交。这意味着在每个复制步骤中,将
map 现在已经消失了,因此“从某种意义上说,为时已晚”。
幸运的是,现在还为时不晚。 :-) 你的 rebase 是可重复的,或者至少,它的关键部分可能是。此外,如果您的 rebase 足够简单,您可能根本不需要重复它。
让我们看看“重复”的想法。我们有一个任意形状的原始图 G:
o--o
/ \
o--o--o---o--o <-- branch-tip
\ /
o--o--o--o
git rebase --root
在它的(部分)上,复制(部分或全部)提交(保留 merge 与否)以获得一些新图 G':
o--o--o--o <-- branch-tip
/
/ o--o
/ / \
o--o--o---o--o
\ /
o--o--o--o
git rev-list
是我们获取节点列表的关键,可能有无法区分“原始的、在 G 中的”和“G 中的新”节点)。但它可能可以做到:在这一点上,这只是编程的一个小问题。
T
的相对地址。在 G 中是我们想要在 G' 中的相对地址,现在使用该相对地址来创建一个指向复制提交的新标签是微不足道的。
A <- B <- C ... <- Z <-- master
foo
指向一个带注释的标记对象,该对象指向提交
W
.然后我们注意到
W
是来自
Z
的四次提交.
A'
,
B'
,依此类推,通过
Z'
. (单个)分支指向最尖端的提交,即
Z'
.我们要调整原始标签
foo
这样我们就有一个新的带注释的标签对象指向
W'
.
master@{1}
(尽管这取决于您从那时起调整分支的次数;如果您在 rebase 后添加了新的提交,我们也需要考虑这些)。它也可能在特殊引用文献
ORIG_HEAD
中, 其中
git rebase
如果您决定不喜欢 rebase 结果,请留下。
master@{1}
是正确的 ID,并且没有这样的新提交。然后:
orig_master=$(git rev-parse master@{1})
$orig_master
中.
$ git rev-list $orig_master > /tmp/orig_list
$ git rev-list master > /tmp/new_list
$ wc -l /tmp/orig_list /tmp/new_list
$
前缀,因为剩下的部分真的应该进入一个脚本,即使对于一次性使用,以防出现错别字和需要调整)
exec 3 < /tmp/orig_list 4 < /tmp/new_list
while read orig_id; do
read new_id <& 4; echo $orig_id $new_id;
done <& 3 > /tmp/mapping
zip
的 shell 版本——以获取映射)。但我们实际上并不需要映射,我们只需要那些“与尖端的距离”计数,所以我将假装我们没有在这里打扰。
# We don't want a pipe here because it's
# not clear what happens if we update an existing
# tag while `git for-each-ref` is still running.
git for-each-ref refs/tags > /tmp/all-tags
# it's also probably a good idea to copy these
# into a refs/original/refs/tags name space, a la
# git filter-branch.
while read sha1 objtype tagname; do
git update-ref -m backup refs/original/$tagname $sha1
done < /tmp/all-tags
# now replace the old tags with new ones.
# it's easy to handle lightweight tags too.
while read sha1 objtype tagname; do
case $objtype in
tag) adj_anno_tag $sha1 $tagname;;
commit) adj_lightweight_tag $sha1 $tagname;;
*) echo "error: shouldn't have objtype=$objtype";;
esac
done < /tmp/all-tags
adj_anno_tag
和
adj_lightweight_tag
shell 函数。不过,首先让我们编写一个 shell 函数,该函数根据旧 ID 生成新 ID,即查找映射。如果我们使用真正的映射文件,我们会对第一个条目进行 grep 或 awk,然后打印第二个条目。然而,使用低俗的单一旧文件方法,我们想要的是匹配 ID 的行号,我们可以通过
grep -n
获得。 :
map_sha1() {
local grep_result line
grep_result=$(grep -n $1 /tmp/orig_list) || {
echo "WARNING: ID $1 is not mapped" 1>&2
echo $1
return 1
}
# annoyingly, grep produces "4:matched-text"
# on a match. strip off the part we don't want.
line=${grep_result%%:*}
# now just get git to spit out the ID of the (line - 1)'th
# commit before the tip of the current master. the "minus
# one" part is because line 1 represents master~0, line 2
# is master~1, and so on.
git rev-parse master~$((line - 1))
}
adj_lightweight_tag() {
local old_sha1=$1 new_sha1 tag=$2
new_sha1=$(map_sha1 $old_sha1) || return
git update-ref -m remap $tag $new_sha1 $old_sha1
}
git filter-branch
窃取代码.我不会在这里全部引用;相反,我只是给你一点:
$ vim $(git --exec-path)/git-filter-branch
git for-each-ref
,并注意
git cat-file
传送到
sed
结果传递给
git mktag
, 设置 shell 变量
new_sha1
.
filter-branch
确实,使用
git rev-parse $old_sha1^{commit}
.
关于git - 如何在 git 中 "rebase tags"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33534411/
我们与一位客户存在某种问题,该客户认为我们发送的 XML 文件中的两个版本的空标记之间存在语义差异(纯 XML 没有 HTML ..)。 他们期望: 我们发送: 我
我想计算文本中 pp/np/vp 的数量,但我不知道如何在 openNLP chunker 中识别 PP-tags/NP-tags/VP-tags?我已经尝试过这段代码,但它不起作用。 Chunker
从我正在阅读的代码的上下文来看,它看起来像 $("")创建一个标签,其中 $('')是一个搜索标签的选择器。这里发生了什么?实际上,我可能没有掌握第二个语法,但我确信我已经完成了 $('idName'
我正在使用 Builder::XmlMarkup 创建 xml。我想创建一个没有内容的标签,因为 api 强制我创建它。如果我使用博客 xml.tag do end 我得到了我想要的 但我希望它更短
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Using the XHTML closing slash (/) on normal tags? Are
默认情况下, someXmlWriter.WriteElementString("my-tag", someString); 产生 我环顾四周XmlWriterSettings强制作者生成 的可能选
如何修改tag-it ui插件https://github.com/aehlke/tag-it (版本 v2.0)因此它只允许选择 x 个标签,以及如何仅允许“availableTags-option
我能够解析这样的内容: value 通过: File inputFile = new File("input.xml"); DocumentBuilderFactory dbFactory = Doc
我不太确定如何编写这个查询,它可以在一个查询中完成。案例如下: 我需要选择标签名称列表,并为每个标签获取最近标记的专辑信息。这意味着,如果用户创建名为“Pamela Anderson”的专辑并将该专辑
这个问题在这里已经有了答案: Where should I put tags in HTML markup? (21 个回答) JavaScript at bottom/top of web pa
Django 2 by Example 中的教程,我不明白: step (2): Why is `Count('tags')` **not** counting the total number of
我是 jekyll 的新手,正在构建我的网站。 我有一个“帖子”布局,我希望与帖子相关的所有标签都出现在左栏中。我遇到的问题是,使用 {{ page.tags }} 会返回一个未以逗号分隔且看起来很乱
如何将一个目录下的所有hash tag重写为slash tag? ( Apache ) http://www.domain.com/company/index#about => http://www.
在查询 Flickr API 并检查返回的标签时,我注意到我收到了未在 Web 界面上显示的其他标签。例如对于此图像: http://www.flickr.com/photos/77060598@N0
我有类似 的东西我想得到这个: <1> <2> 但我只想在 中应用它标签而不是其他任何地方。 我已经有了这个: $txt = $this->input->post('
我想删除 xxx yyyy zzz 用 php。但是,首先,我想控制字符串是否以 开头并以 结尾 是否有用于此目的的函数? if(string begins with '' and ends wi
在我的模板中加载自定义标签时出现此错误。我访问了许多关于此的主题,并且确保确认我没有犯一些常见错误: 包含标签的文件在 templatetags 中文件夹。 此 templatetags文件夹包含 _
API doc中没有关于构造函数的文档。我想了解SvgElement.tag()的用途/用例。 最佳答案 SvgElement.tag(String tag)构造函数为对应的SvgElement值创建
$('*').data('tag', "tagged"); $('li[tag=tagged]').length 返回零... 最佳答案 $('*').data('tag', "tagged"); $
下面的代码出错了。我该如何解决这个问题? {% block header %} {% endblock %} 错误输出: TemplateSyntaxError : Invalid bloc
我是一名优秀的程序员,十分优秀!