0

我的团队正在使用运行的 bash 脚本p4 interchanges -S $stream来确定哪些任务流仍需要复制到其父级。

对于具有两个更改列表的流,其中一个撤消另一个(累积差异为空),脚本并不是说所有修订都已集成,尽管流已被复制到其父级。

有没有办法p4 interchanges识别空差异不需要集成,或者我们可以在这里使用另一个 p4 命令吗?

4

1 回答 1

0

这取决于您如何撤消更改列表。如果您使用了该p4 undo命令,那么p4 integrate(并且通过扩展p4 interchanges)能够通过遵循由p4 undo. 如果您通过手动编辑撤消了它,那么从元数据的角度来看,每个修订看起来都像是一个新的编辑(这就是所有integrate/interchanges考虑的 - 实际文件内容检查委托给resolve)。

这是一个示例文件(我认为)演示了您正在谈论的未完成更改的情况,因此累积效果没有差异:

C:\Perforce\test\undo>p4 filelog -i bar
//stream/test2/undo/bar
... #3 change 250 integrate on 2021/06/25 by Samwise@Samwise-dvcs-1509687817 (text) 'undo'
... ... undid //stream/test2/undo/bar#2
... #2 change 249 edit on 2021/06/25 by Samwise@Samwise-dvcs-1509687817 (text) 'foo'
... ... undone by //stream/test2/undo/bar#3
... #1 change 248 branch on 2021/06/25 by Samwise@Samwise-dvcs-1509687817 (text) 'foo'
... ... branch from //stream/test2/undo/foo#1
//stream/test2/undo/foo
... #1 change 236 add on 2021/01/28 by Samwise@Samwise-dvcs-1509687817 (text) 'add foo'
... ... branch into //stream/test2/undo/bar#1

如您所见,integrate并将其interchanges报告为无事可做:

C:\Perforce\test\undo>p4 interchanges bar foo
bar - all revision(s) already integrated.

C:\Perforce\test\undo>p4 integ bar foo
bar - all revision(s) already integrated.

这要归功于undo/undone您可以在文件日志中看到的学分。 integrate可以看到#3 正好是#2 的倒数,所以它把它们加在一起,发现什么都不做。

现在假设我添加另一个编辑并执行“假撤销”(例如,如果您使用不知道的旧脚本或 P4V 版本回滚更改,就会发生这种情况p4 undo):

C:\Perforce\test\undo>p4 edit bar
//stream/test2/undo/bar#3 - opened for edit

C:\Perforce\test\undo>echo asdfasdf >> bar

C:\Perforce\test\undo>p4 submit -d edit
Submitting change 251.
Locking 1 files ...
edit //stream/test2/undo/bar#4
Change 251 submitted.

C:\Perforce\test\undo>p4 sync bar#3
//stream/test2/undo/bar#3 - updating c:\Perforce\test\undo\bar

C:\Perforce\test\undo>p4 edit bar
//stream/test2/undo/bar#3 - opened for edit
... //stream/test2/undo/bar - must sync/resolve #4 before submitting

C:\Perforce\test\undo>p4 sync bar
//stream/test2/undo/bar#4 - is opened and not being changed
... //stream/test2/undo/bar - must resolve #4 before submitting

C:\Perforce\test\undo>p4 resolve -ay
c:\Perforce\test\undo\bar - vs //stream/test2/undo/bar#4
//Samwise-dvcs-1509687817/undo/bar - ignored //stream/test2/undo/bar

C:\Perforce\test\undo>p4 submit -d "fake undo"
Submitting change 252.
Locking 1 files ...
edit //stream/test2/undo/bar#5
Change 252 submitted.

C:\Perforce\test\undo>p4 integ -n bar foo
//stream/test2/undo/foo#1 - integrate from //stream/test2/undo/bar#2,#5

C:\Perforce\test\undo>p4 interchanges bar foo
Change 251 on 2021/06/25 by Samwise@Samwise-dvcs-1509687817 'edit'
Change 252 on 2021/06/25 by Samwise@Samwise-dvcs-1509687817 'fake undo'

如果我想事后解决这个问题怎么办?您提到流已经被复制了——使用普通副本,如果文件已经相同,则没有元数据记录(由于某种像这样的棘手操作)。也就是说,即使integrate看到未完成的修订,也会copy说“最新”:

C:\Perforce\test\undo>p4 copy -n bar foo
File(s) up-to-date.

在大多数情况下,这无关紧要,因为您不会沿同一方向复制和合并,因此会copy无缘无故地倾向于不创建额外的修订。但是,如果您确实希望更新记录以便彼此达成一致copyintegrate您可以使用该标志进行复制-f,这会告诉它为集成信用的唯一目的创建新修订:

C:\Perforce\test\undo>p4 copy -f bar foo
//stream/test2/undo/foo#1 - sync/integrate from //stream/test2/undo/bar#2,#5

C:\Perforce\test\undo>p4 submit -d "recordkeeping copy"
Submitting change 253.
Locking 1 files ...
integrate //stream/test2/undo/foo#2
Change 253 submitted.

C:\Perforce\test\undo>p4 interchanges bar foo
bar - all revision(s) already integrated.

如果文件相同并且信用完全是最新的,则该copy -f操作仍然不会执行任何操作:

C:\Perforce\test\undo>p4 copy -f bar foo
File(s) up-to-date.

所以在非边缘情况下使用也是安全的。

现在,如果您对此没有任何控制权,并且您只希望您的脚本在两个流的内容相同时不报告更改列表,即使它们在信用方面不是完全最新的:做p4 copy -n之前做p4 interchanges,并且如果它报告“最新”,那么出于您的目的,您可以将其视为p4 interchanges报告同一件事。

于 2021-06-25T15:16:35.010 回答