更改 git 历史记录中保存标签的文件内容

问题描述 投票:0回答:1

我有很多带有 DVC 的 git 存储库。 DVC 有文件

.dvc/config
,指的是远程(云存储)。我想从一个远程迁移到另一个远程,因此步骤之一是编辑
.dvc/config
的 git 历史记录,以便它始终引用正确的(新)远程。 通常,DVC 发布(提交)都会被标记。所以我想用标签更改提交中的
.dvc/config
文件,但也将标签保留在原来的位置。 总而言之,我只想更改
.dvc/config
的内容,并尽可能保持其他内容不变(包括 git meta)。我怎样才能做到这一点(如果以某种方式编写脚本会更好 - bash/python)?

我不知道在这种情况下如何编辑 git 历史记录 - 我没有想到正确的算法。尝试过

rebase
和其他 git 命令,但没有成功 - 新提交是使用新哈希值进行的,标签位于旧提交上,呃..

git git-commit git-tag
1个回答
0
投票

按照设计(并且有充分的理由),不可能修改 Git 提交。您只能创建新的提交。

您使用

rebase
的方法实际上在这里是正确的。 Rebase 会遍历您的提交历史记录,并允许您任意修改文件、运行命令(请参阅
rebase --exec
)、删除提交、修改提交元数据,甚至在此过程中插入新的提交。

但是,您不能做的一件事是进行任何更改并保持 Git 哈希值相同。再说一遍,这是设计使然,并且有充分的理由。

假设您有一系列提交

A ← B ← C ← D
,并且您想要修改提交
A
,而其余部分保持不变。不幸的是,您无法修改
A
,您只能进行全新的提交,我们将其称为
A*
。所以现在你想修改
B
以指向
A*
而不是
A
作为其父级,但是你不能修改
B
,你只能进行一个全新的提交,我们将其称为
B*
。如此继续下去,直到您将整个历史重写为
A* ← B* ← C* ← D*
。所有旧提交
A
B
C
D
仍然存在,但除非您有另一个分支或标签指向
D
或其后代之一,否则它们现在将“无法访问” “最终它们都会被垃圾收集。

如果您想在此操作后保留标签,则需要使用

git tag -f
重新创建它们。参见例如如何将 git 分支上的标签移动到不同的提交?.

考虑您可能希望保留旧标签,创建新标签而不是替换旧标签。

如果您已将此存储库推送到远程,您现在需要:

  1. 为新提交创建一个新分支,并告诉其他用户开始使用该分支而不是旧分支。
  2. 重命名旧分支,强制推送到您的分支,并告诉其他用户按照他们认为合适的方式处理它。请参阅:`git push --force`的其他后果?
  3. 使用
    ours
    策略在旧分支和新基址/编辑的分支之间创建合并提交。请参阅:https://stackoverflow.com/a/2862938/2954547

从其他用户的角度来看,选项 3 可能影响最小。

最后,一种选择可能是避免将远程存储详细信息放入

.dvc/config
,而是使用
.dvc/config.local
。这样,如果您迁移到新的远程主机,则不必重写 Git 历史记录。这里的权衡是远程主机不再存储在版本控制中,这可能会导致其他问题。这与迁移到新 Git 主机的 Git 子模块的情况非常相似,这在新提交中并不难做到,但如果您想维护正确运行的代码的历史记录,则会带来相同的挑战。

© www.soinside.com 2019 - 2024. All rights reserved.