我的团队正在使用运行的 bash 脚本p4 interchanges -S $stream
来确定哪些任务流仍需要复制到其父级。
对于具有两个更改列表的流,其中一个撤消另一个(累积差异为空),脚本并不是说所有修订都已集成,尽管流已被复制到其父级。
有没有办法p4 interchanges
识别空差异不需要集成,或者我们可以在这里使用另一个 p4 命令吗?
我的团队正在使用运行的 bash 脚本p4 interchanges -S $stream
来确定哪些任务流仍需要复制到其父级。
对于具有两个更改列表的流,其中一个撤消另一个(累积差异为空),脚本并不是说所有修订都已集成,尽管流已被复制到其父级。
有没有办法p4 interchanges
识别空差异不需要集成,或者我们可以在这里使用另一个 p4 命令吗?
这取决于您如何撤消更改列表。如果您使用了该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
无缘无故地倾向于不创建额外的修订。但是,如果您确实希望更新记录以便彼此达成一致copy
,integrate
您可以使用该标志进行复制-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
报告同一件事。