退出更改列表后重新提交的正确工作流程是什么?
What's the correct workflow for resubmitting after backing out a changelist?
我最近不得不撤回提交的变更列表 (CL#926201),因为发现与另一个项目存在 运行时间冲突。
退出更改列表后,我同步到我之前使用(从我的工作空间的根目录)提交的更改列表:
p4 sync ...@926201
这将我更改的文件的旧修订版下载到工作区,但没有将它们添加到待处理的更改列表中。
我希望将原始更改列表中的文件添加到新的更改列表中,以便在本地调查问题并进行任何必要的修改后重新提交它们。
我找不到任何可以为我完成此操作的命令,但我确实通过使用(从我的工作区的根目录)协调了我的工作区中未添加到我的工作区的任何更改列表中的更改文件:
p4 reconcile
事实证明这是一个错误。该命令花了大约一个小时 运行,并最终添加了我曾经 运行 从该工作区中的每个项目的每个目标目录中的每个工件。我最终得到了一个包含 52,000 个文件的更改列表。 Perforce 尽职尽责地为我检查了仓库中的所有这些文件,这又花了一个小时左右的时间来撤消。
此时我决定只手动将我在 CL#926201 中修改过的文件添加到新的更改列表中。这花了一段时间,但我最终得到的一切都与最初提交 CL#926201 之前的情况相匹配。
万一我在这个过程中犯了错误,我决定再次与软件仓库同步,以确保差异正是我想要保留的差异。我为此使用了 IntelliJ,我假设它在内部调用了某种 p4 sync 风格(我知道强制标志已关闭,因为在 IntelliJ GUI 中有一个选项)。我预计会有合并冲突(或任何 Perforce 称呼它们的冲突),这将允许我简单地接受所有本地修订。不幸的是,我的新变更列表中的所有文件都立即恢复为撤消修订版。我怀疑从之前检索特定修订版以某种方式将这些文件标记为 "okay to overwrite these because they're old"。我不知道具体情况,但我很想知道。
既然我回到了原点,我决定放弃直接使用 Perforce,最终手动将所有文件差异逐行复制到现有的 类 中,这样它们看起来就像当我最终去提交它们时,对 Perforce 进行了新的更改。这是一个乏味的过程,我觉得不得不这样做很愚蠢,但它最终奏效了。
现在我想知道我应该如何处理这件事。这似乎是一个相当常见的用例,但我找不到任何关于恢复更改并在退出后重新提交更改的正确方法的提及。我应该在这里做什么?
请记住,恢复已撤消的变更列表实际上只是撤回变更列表的另一种情况(您正在撤回撤回),因此我要说的一切都与撤回变更列表有关,而不是一般而言"resubmitting" 特别是一个已退出的更改列表。 :)
如果您的目标是将当前目录下的所有内容恢复到更改 926201 时的状态,这里有一个非常简单的选项:
p4 copy ...@926201 ...
这将打开文件,因此您可以在提交前查看结果 changelist/diffs/etc。
如果您使用 reconcile 来执行此操作,则步骤顺序将更像是:
p4 sync ...@926201
p4 sync -k ...
p4 reconcile ...
这里的技巧是你想告诉服务器你正在对与 head 修订版相关的文件进行操作,即使你的工作区的实际内容是 @926201 —— 这就是 "sync -k"进来(将 have rev 增加到 head rev,同时保持物理工作区内容)。
有关 "p4 copy" 和 "p4 reconcile" 之前更复杂的变体,请参阅这篇 Perforce 知识库文章:http://answers.perforce.com/articles/KB/3474/?q=backout+a+changelist&l=en_US&fs=RelatedArticle
根据您对从 IntelliJ 执行 "sync" 的描述,听起来 "revert" 可能已在幕后参与 - 一旦使用 "p4 edit" 或 [= 打开文件30=], "p4 sync" 绝对不会碰它,即使有“-f”选项。它最多会安排一个 "p4 resolve"(然后 update/overwrite/merge/keep 根据选择的解析选项的内容)。
我最近不得不撤回提交的变更列表 (CL#926201),因为发现与另一个项目存在 运行时间冲突。
退出更改列表后,我同步到我之前使用(从我的工作空间的根目录)提交的更改列表:
p4 sync ...@926201
这将我更改的文件的旧修订版下载到工作区,但没有将它们添加到待处理的更改列表中。
我希望将原始更改列表中的文件添加到新的更改列表中,以便在本地调查问题并进行任何必要的修改后重新提交它们。
我找不到任何可以为我完成此操作的命令,但我确实通过使用(从我的工作区的根目录)协调了我的工作区中未添加到我的工作区的任何更改列表中的更改文件:
p4 reconcile
事实证明这是一个错误。该命令花了大约一个小时 运行,并最终添加了我曾经 运行 从该工作区中的每个项目的每个目标目录中的每个工件。我最终得到了一个包含 52,000 个文件的更改列表。 Perforce 尽职尽责地为我检查了仓库中的所有这些文件,这又花了一个小时左右的时间来撤消。
此时我决定只手动将我在 CL#926201 中修改过的文件添加到新的更改列表中。这花了一段时间,但我最终得到的一切都与最初提交 CL#926201 之前的情况相匹配。
万一我在这个过程中犯了错误,我决定再次与软件仓库同步,以确保差异正是我想要保留的差异。我为此使用了 IntelliJ,我假设它在内部调用了某种 p4 sync 风格(我知道强制标志已关闭,因为在 IntelliJ GUI 中有一个选项)。我预计会有合并冲突(或任何 Perforce 称呼它们的冲突),这将允许我简单地接受所有本地修订。不幸的是,我的新变更列表中的所有文件都立即恢复为撤消修订版。我怀疑从之前检索特定修订版以某种方式将这些文件标记为 "okay to overwrite these because they're old"。我不知道具体情况,但我很想知道。
既然我回到了原点,我决定放弃直接使用 Perforce,最终手动将所有文件差异逐行复制到现有的 类 中,这样它们看起来就像当我最终去提交它们时,对 Perforce 进行了新的更改。这是一个乏味的过程,我觉得不得不这样做很愚蠢,但它最终奏效了。
现在我想知道我应该如何处理这件事。这似乎是一个相当常见的用例,但我找不到任何关于恢复更改并在退出后重新提交更改的正确方法的提及。我应该在这里做什么?
请记住,恢复已撤消的变更列表实际上只是撤回变更列表的另一种情况(您正在撤回撤回),因此我要说的一切都与撤回变更列表有关,而不是一般而言"resubmitting" 特别是一个已退出的更改列表。 :)
如果您的目标是将当前目录下的所有内容恢复到更改 926201 时的状态,这里有一个非常简单的选项:
p4 copy ...@926201 ...
这将打开文件,因此您可以在提交前查看结果 changelist/diffs/etc。
如果您使用 reconcile 来执行此操作,则步骤顺序将更像是:
p4 sync ...@926201
p4 sync -k ...
p4 reconcile ...
这里的技巧是你想告诉服务器你正在对与 head 修订版相关的文件进行操作,即使你的工作区的实际内容是 @926201 —— 这就是 "sync -k"进来(将 have rev 增加到 head rev,同时保持物理工作区内容)。
有关 "p4 copy" 和 "p4 reconcile" 之前更复杂的变体,请参阅这篇 Perforce 知识库文章:http://answers.perforce.com/articles/KB/3474/?q=backout+a+changelist&l=en_US&fs=RelatedArticle
根据您对从 IntelliJ 执行 "sync" 的描述,听起来 "revert" 可能已在幕后参与 - 一旦使用 "p4 edit" 或 [= 打开文件30=], "p4 sync" 绝对不会碰它,即使有“-f”选项。它最多会安排一个 "p4 resolve"(然后 update/overwrite/merge/keep 根据选择的解析选项的内容)。