ClearCase quiere fusionar los archivos no modificados después de entregar al destino alternativo

StackOverflow https://stackoverflow.com/questions/1090911

  •  11-09-2019
  •  | 
  •  

Pregunta

Uso Racional ClearCase v. 7.0.1.1 con la UCM, tengo un problema cuando se utiliza aquí ClearCase de "Entregar de Corriente Alterna a Target" funcionalidad.

Imaginemos que tenemos un flujo de integración de proyectos y dos corrientes desarrollador A y B derivada de ella. Ahora puedo cambiar un archivo en la corriente A. Quiero que el delevoper ser dueño de la corriente B para poder utilizar mi trabajo sin tener que entregar el archivo a la corriente de integración todavía, así que libraros de flujo A a la corriente alterna de destino B.

Hasta ahora, todo bien. Me voy de hacer otro cambio en el archivo pero el desarrollador de la corriente B no necesita este cambio, por lo que no entrego a él.

Después de un poco más de tiempo, entrego mi trabajo a la corriente principal de la integración. Esto funciona bien, aunque me pregunto por qué ClearCase marca la fusión como una normal "fusionado" en lugar de "Fusionada (trivial)." - nadie excepto yo ha realizado cambios en el archivo

Después de la entrega, una nueva línea de base se crea en la corriente de integración principal.

El problema surge real cuando el desarrollador B intenta reajustar su flujo. Desde el desarrollador B nunca ha realizado ningún cambio en el archivo, yo esperaría que la fusión sea trivial, sin interacción necesaria. Pero lo que sucede es que el desarrollador B se ve obligado a resolver un conflicto de combinación en ese archivo de forma gráfica, dejando que elegir entre la versión de la base en el flujo de la integración, la versión que he entregado a él y la versión que he enseñado a la corriente de integración.

La confusión continúa cuando, después de la resolución de la fusión y completar el rebase, el desarrollador B quiere llevar a cabo una entrega a la corriente principal de la integración. Además de la actividad que originalmente entregado a él, también se ofrece para entregar una actividad que se llama rebase _..., que nunca se podría esperar que se ofrecerán para la entrega.

Me estoy perdiendo algo aquí? ¿Estamos utilizando ClearCase de forma incorrecta o se trata de una limitación / fallo conocido? Tiene experiencia a nadie con esta funcionalidad?

Gracias de antemano por su ayuda!

Jan

¿Fue útil?

Solución

En realidad, cuando miro el árbol de versiones, la fuente del conflicto durante el rebase es clara:

árbol de versiones con el conflicto

Cuando se vuelva a leer la forma ClearCase de 3 vías de fusión funciona , se ve que tiene que ir hacia atrás en el árbol de versiones con el fin de encontrar un ancestro común a:

  • la fuente (Int / 2)
  • el destino (B / 1)

Eso es ancestro común Int / 1

Ahora bien, es posible que una línea común ha cambiado entre los dos versiones desde:

  • la fuente de la última rebase (Int / 2) viene de A / 3
  • el destino de la última rebase (B / 1) proviene de A / 2
  • el ancestro común (Int / 1) proviene de A / 1

Si una línea común ha sido modificada (de la A / 1), tanto en A / 2 y A / 3 ... hay una razón para una resolución de combinación manual de ahí!

(estoy probando esto ahora)


¡Gracias! Conflicto logrado!

experimento anterior :

Vamos a hacer una nueva modif en arroyo R:

M:\vonc_test_dat_a\adev\test>ct co -nc aFile.txt
M:\vonc_test_dat_a\adev\test>echo modif by A to B>>aFile.txt
M:\vonc_test_dat_a\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_a\adev\test>type aFile.txt
first line done on Int
Second line from Int
Addition by A to be delivered to B first
Modification by A to be delivered to Int, B does not need it
modif by A to B

Entregando que directamente a B:

M:\vonc_test_dat_a\adev\test>ct deliver -to vonc_test_dat_b -target Test_DAT_B@\myPVob -cact -gmerge -force
Changes to be DELIVERED to non-default target stream in current project "Test_DeliverToAlternateTarget":
          FROM: stream "Test_DAT_A"
          TO: stream "Test_DAT_B"
Using target view: "vonc_test_dat_b".
Activities included in this operation:
        activity:test_dat_a@\myPVob   vonc        "test_dat_a"
Trivial merge: "M:\vonc_test_dat_b\adev\test\aFile.txt" is same as base "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\Test_DAT_A\2".
Copying "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\Test_DAT_A\3" to output file.
Deliver has merged

M:\vonc_test_dat_a\adev\test>ct deliver -target Test_DAT_B@\myPVob -cact -complete -force

(Trivial de combinación)

Ahora vamos a completelty cambiar el contenido de ese archivo:

M:\vonc_test_dat_a\adev\test>ct co -nc aFile.txt
M:\vonc_test_dat_a\adev\test>echo change first line>aFile.txt
M:\vonc_test_dat_a\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_a\adev\test>type aFile.txt
change first line

Y la entrega a Int, con una nueva línea de base puso justo después de la entrega:

M:\vonc_test_dat_a\adev\test>ct deliver -force
M:\vonc_test_dat_a\adev\test>ct deliver -force -complete
M:\vonc_test_dat_a\adev\test>ct mkbl -comp ADV_TST@\myPVob -view vonc_test_dat_int TST_DAT1.2.0

(otra combinación trivial)

¿Qué pasa con un rebase de B?

M:\vonc_test_dat_b\adev\test>ct rebase -bas TST_DAT1.2.0
Advancing to baseline "TST_DAT1.2.0" of component "ADV_TST"
Updating rebase view's config spec...
Creating integration activity...
Setting integration activity...
Merging files...
Checked out "M:\vonc_test_dat_b\adev\test\aFile.txt" from version "\main\Test_DAT_Int\Test_DAT_B\3".
  Attached activity:
    activity:rebase.Test_DAT_B.20090707.163300@\myPVob  "rebase Test_DAT_B on 07/07/09 4:33:00 PM."
Needs Merge "M:\vonc_test_dat_b\adev\test\aFile.txt" [to \main\Test_DAT_Int\Test_DAT_B\CHECKEDOUT from \main\Test_DAT_Int\4 base \main\T
est_DAT_Int\3]
********************************
<<< file 1: M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\3
>>> file 2: M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\4
>>> file 3: M:\vonc_test_dat_b\adev\test\aFile.txt
********************************
---------[changed 1-4 file 1]----------|---------[changed to 1 file 2]---------
first line done on Int                 | change first line
Second line from Int                   |-
Addition by A to be delivered to B fir+|
Modification by A to be delivered to I+|
                                      -|
*** Automatic: Applying CHANGE from file 2 [line 1]
============
============
-----------[after 4 file 1]------------|----------[inserted 5 file 3]----------
                                      -| modif by A to B
                                       |-
Do you want the INSERTION made in file 3?  [yes] no
============
============
Output of merge is in "M:\vonc_test_dat_b\adev\test\aFile.txt".
Recorded merge of "M:\vonc_test_dat_b\adev\test\aFile.txt".
Build and test are necessary to ensure that any merges and configuration changes were completed correctly.
When build and test are confirmed, run "cleartool rebase -complete".

Ahí lo tienes:. Un buen conflicto entre dos cambios incompatibles desde el ancestro común

Aquí está la foto para ilustrar que:

conflicto durante la fusión

.

Otros consejos

Me sorprende por este conflicto:. Desde ClearCase hace registrar la fusión de corriente A a B, a menos que la corriente B no tiene la misma línea base de cimentación (punto de partida de la rama o la etiqueta inicial) de Stream

  

Además de la actividad que originalmente entregado a él, también se ofrece para entregar una actividad que se llama rebase _..., que nunca se podría esperar que se ofrecerán para la entrega.

Cuando se rebase de int a B, se crea una "línea de tiempo" automático que une todas las actividades juntos.
Esto quiere decir que durante el próximo entregas, B tendrá que entregar rebase a pesar de que no hay fusión se realizará para todas las versiones presentes en este conjunto de cambios.


Algunos comentarios primeros:

  • puede que desee evitar la creación de corrientes vinculados a los recursos (desarrollador "A", el desarrollador "B"): si se está trabajando en conjunto independiente de archivos para el mismo "esfuerzo de desarrollo" global, sólo debe haber uno Stream_FeatureF que representa la tarea en cuestión.
    A y B, entonces deben ver el mismo último de la misma rama unida a esa corriente (sin necesidad de librar de una secuencia a otra)
    Si B rompe constantemente el trabajo de A, entonces y sólo entonces una sub-secuencia se puede crear para los perturbadores sub-característica que no puede ser desarrollado al mismo tiempo que la principal característica de "F".

  • El entregar / rebase GUI no muestra "Sí (trivial)" cuando una fusión es triviales (ver mi prueba más adelante). Eso no significa que la fusión no es trivial (es decir, que la base es la misma que la fuente o el destino, consulte conceptos básicos )

  • mi prueba a continuación respeta el flujo de trabajo de fusiones que describes, pero muestra combina sólo triviales.
    queridos lo que podría explicar no triviales serían " gemelos del mal " (un archivo añadió en una corriente, pero se vuelve a crear desde cero en el otro, con el mismo nombre)


Muy bien, vamos a probar esto, asumiendo una "ADEV" VOB (siglas de "arquitectura de desarrollo", donde mi equipo almacena sus herramientas), con un componente ADV_TST UCM en \ ADEV \ test.
ClearCase7.0.1 en Windows (aunque el VOB es en realidad en Unix)

Vamos a comenzar con un proyecto de prueba, una corriente de Integración y un componente de ensayo vacío:

M:\>ct mkproj -in folder:ADV_Tests@\myPVob Test_DeliverToAlternateTarget@\myPVob
M:\>ct mkstream -int -in Test_DeliverToAlternateTarget@\myPVob Test_DAT_Int@\myPVob
Created stream "Test_DAT_Int".
M:\>ct mkview -tag vonc_test_dat_int -stream Test_DAT_Int@\myPVob -stg hostname_ccstg_c_views
M:\vonc_test_dat_int\adev\test>ct rebase -bas ADV_TST0.0.0
Adding baseline "ADV_TST0.0.0" of new component "ADV_TST"
M:\vonc_test_dat_int\adev\test>ct rebase -complete

Vamos a hacer el componente se puede escribir:

M:\vonc_test_dat_int\adev\test>ct chproj -amodcomp component:ADV_TST@\myPVob Test_DeliverToAlternateTarget@\myPVob
M:\vonc_test_dat_int\adev\test>ct chstream -generate Test_DAT_Int@\myPVob
M:\vonc_test_dat_int\adev\test>ct setcs -stream

A creará un archivo en Int, añadir, modificarlo, y luego poner una línea de base:

M:\vonc_test_dat_int\adev\test>ct mkact test_dat_int
M:\vonc_test_dat_int\adev\test>echo first line done on Int>aFile.txt
M:\vonc_test_dat_int\adev\test>ct co -nc .
M:\vonc_test_dat_int\adev\test>ct mkelem -nc aFile.txt
M:\vonc_test_dat_int\adev\test>ct ci -nc .
M:\vonc_test_dat_int\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_int\adev\test>ct co -nc aFile.txt
M:\vonc_test_dat_int\adev\test>echo Second line from Int>>aFile.txt
M:\vonc_test_dat_int\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_int\adev\test>type aFile.txt
first line done on Intct mkview vonc_
Second line from Int

M:\vonc_test_dat_int\adev\test>ct mkbl -comp ADV_TST@\myPVob TST_DAT1.0.0
Created baseline "TST_DAT1.0.0" in component "ADV_TST".

Ahora, vamos a crear dos sub-secuencia, uno para cada uno desarrolladores (que puede considerarse "mala práctica" sin embargo), tanto inicializado con el mismo TST_DAT1.0.0 línea de base:

M:\vonc_test_dat_int\adev\test>ct mkstream -in Test_DAT_Int@\myPVob Test_DAT_A@\myPVob
M:\vonc_test_dat_int\adev\test>ct mkstream -in Test_DAT_Int@\myPVob Test_DAT_B@\myPVob
M:\vonc_test_dat_int\adev\test>ct mkview -tag vonc_test_dat_a -stream Test_DAT_A@\myPVob -stg hostname_ccstg_c_views
M:\vonc_test_dat_int\adev\test>ct mkview -tag vonc_test_dat_b -stream Test_DAT_B@\myPVob -stg hostname_ccstg_c_views
M:\vonc_test_dat_int\adev\test>ct rebase -view vonc_test_dat_a -bas TST_DAT1.0.0
M:\vonc_test_dat_int\adev\test>ct rebase -view vonc_test_dat_a -complete
M:\vonc_test_dat_int\adev\test>ct rebase -view vonc_test_dat_b -bas TST_DAT1.0.0
M:\vonc_test_dat_int\adev\test>ct rebase -view vonc_test_dat_b -complete

Un hará una modificación en su corriente A, para ser entregados a B:

M:\vonc_test_dat_a\adev\test>ct mkact test_dat_a
M:\vonc_test_dat_a\adev\test>ct co -nc aFile.txt
Created branch "Test_DAT_A" from "aFile.txt" version "\main\Test_DAT_Int\2".
M:\vonc_test_dat_a\adev\test>echo Addition by A to be delivered to B first>>aFile.txt
M:\vonc_test_dat_a\adev\test>ct ci -nc aFile.txt

Entregando directamente de corriente de A a B:

M:\vonc_test_dat_a\adev\test>ct deliver -to vonc_test_dat_b -target Test_DAT_B@\myPVob -cact -gmerge
Changes to be DELIVERED to non-default target stream in current project "Test_DeliverToAlternateTarget":
          FROM: stream "Test_DAT_A"
          TO: stream "Test_DAT_B"
Using target view: "vonc_test_dat_b".
Activities included in this operation:
        activity:test_dat_a@\myPVob   vonc        "test_dat_a"
Created branch "Test_DAT_B" from "M:\vonc_test_dat_b\adev\test\aFile.txt" version "\main\Test_DAT_Int\2".
Checked out "M:\vonc_test_dat_b\adev\test\aFile.txt" from version "\main\Test_DAT_Int\Test_DAT_B\0".
  Attached activity:
    activity:deliver.Test_DAT_A.20090707.123738@\myPVob  "deliver Test_DAT_A on 07/07/09 12:37:38 PM."
Needs Merge "M:\vonc_test_dat_b\adev\test\aFile.txt" [to \main\Test_DAT_Int\Test_DAT_B\CHECKEDOUT from \main\Test_DAT_Int\Test_DAT_A\1 b
ase \main\Test_DAT_Int\2]
Trivial merge: "M:\vonc_test_dat_b\adev\test\aFile.txt" is same as base "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\
2".
Copying "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\Test_DAT_A\1" to output file.
Deliver has merged
M:\vonc_test_dat_a\adev\test>ct deliver -target Test_DAT_B@\myPVob -force -complete

confirmo la GUI no mostró Trivial a pesar de la salida textual de la misma no mencionar entregar Trivial merge ...

Un continúa trabajando en 'aFile.txt' y lo entrega a INT:

M:\vonc_test_dat_a\adev\test>ct co -nc aFile.txt
M:\vonc_test_dat_a\adev\test>echo Modification by A to be delivered to Int, B does not need it>>aFile.txt
M:\vonc_test_dat_a\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_a\adev\test>ct deliver
Changes to be DELIVERED to default target stream in project "Test_DeliverToAlternateTarget":
          FROM: stream "Test_DAT_A"
          TO: stream "Test_DAT_Int"
Using target view: "vonc_test_dat_int".
Activities included in this operation:
        activity:test_dat_a@\myPVob   vonc        "test_dat_a"
Do you wish to continue with this deliver operation?  [no] yes
Checked out "M:\vonc_test_dat_int\adev\test\aFile.txt" from version "\main\Test_DAT_Int\2".
  Attached activity:
    activity:deliver.Test_DAT_A.20090707.124108@\myPVob  "deliver Test_DAT_A on 07/07/09 12:41:08 PM."
Needs Merge "M:\vonc_test_dat_int\adev\test\aFile.txt" [to \main\Test_DAT_Int\CHECKEDOUT from \main\Test_DAT_Int\Test_DAT_A\2 base \main
\Test_DAT_Int\2]
Trivial merge: "M:\vonc_test_dat_int\adev\test\aFile.txt" is same as base "M:\vonc_test_dat_int\adev\test\aFile.txt@@\main\Test_DAT_
Int\2".
Copying "M:\vonc_test_dat_int\adev\test\aFile.txt@@\main\Test_DAT_Int\Test_DAT_A\2" to output file.
Deliver has merged
M:\vonc_test_dat_a\adev\test>ct deliver -force -complete

(Otra combinación trivial)

Vamos a poner una línea de base sobre Int:

M:\vonc_test_dat_a\adev\test>ct mkbl -nc -view vonc_test_dat_int TST_DAT1.1.0
Created baseline "TST_DAT1.1.0" in component "ADV_TST".
Begin incrementally labeling baseline "TST_DAT1.1.0".
Done incrementally labeling baseline "TST_DAT1.1.0".

Ahora, cambiamos a B, que comienza con un poco de trabajo de su propia en otro archivo:

M:\vonc_test_dat_b\adev\test>ct mkact test_dat_b
M:\vonc_test_dat_b\adev\test>echo myFile by B>aFileByB.txt
M:\vonc_test_dat_b\adev\test>ct co -nc .
M:\vonc_test_dat_b\adev\test>ct mkelem -nc aFileByB.txt
M:\vonc_test_dat_b\adev\test>ct ci -nc aFileByB.txt
M:\vonc_test_dat_b\adev\test>ct ci -nc .

Y entonces, de repente, tiene que reajustar su trabajo con lo que se ha consolidado en Int:

M:\vonc_test_dat_b\adev\test>ct rebase -bas TST_DAT1.1.0
Advancing to baseline "TST_DAT1.1.0" of component "ADV_TST"
Updating rebase view's config spec...
Creating integration activity...
Setting integration activity...
Merging files...
Checked out "M:\vonc_test_dat_b\adev\test\aFile.txt" from version "\main\Test_DAT_Int\Test_DAT_B\1".
  Attached activity:
    activity:rebase.Test_DAT_B.20090707.125044@\myPVob  "rebase Test_DAT_B on 07/07/09 12:50:44 PM."
Needs Merge "M:\vonc_test_dat_b\adev\test\aFile.txt" [to \main\Test_DAT_Int\Test_DAT_B\CHECKEDOUT from \main\Test_DAT_Int\3 base \main\T
est_DAT_Int\Test_DAT_A\1]
Trivial merge: "M:\vonc_test_dat_b\adev\test\aFile.txt" is same as base "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\
Test_DAT_A\1".
Copying "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\3" to output file.
Output of merge is in "M:\vonc_test_dat_b\adev\test\aFile.txt".
Recorded merge of "M:\vonc_test_dat_b\adev\test\aFile.txt".

M:\vonc_test_dat_b\adev\test>type aFile.txt
first line done on Int
Second line from Int
Addition by A to be delivered to B first
Modification by A to be delivered to Int, B does not need it

M:\vonc_test_dat_b\adev\test>ct rebase -complete

No hay conflicto en absoluto:. Trivial se funde de nuevo

B continúa trabajando en su archivo:

M:\vonc_test_dat_b\adev\test>ct setact test_dat_b
M:\vonc_test_dat_b\adev\test>ct co -nc aFileByB.txt
M:\vonc_test_dat_b\adev\test>echo a modif by B to be delivered to Int>>aFileByB.txt
M:\vonc_test_dat_b\adev\test>ct ci -nc aFileByB.txt

Y entonces se entrega el trabajo a todos Int:

M:\vonc_test_dat_b\adev\test>ct deliver -cact
cleartool: Error: Activity "deliver.Test_DAT_A.20090707.123738" must be added to activity list to preserve baseline order in stream.
cleartool: Error: Activity "rebase.Test_DAT_B.20090707.125044" must be added to activity list to preserve baseline order in stream.
cleartool: Error: The list of activities specified is incomplete.
cleartool: Error: Unable to deliver selected activities.
cleartool: Error: Unable to deliver stream "Test_DAT_B".

Yo confirmar que tiene que seleccionar todas las actividades (no sólo de él): el Timeline establecido durante la última rebase ha vinculado todas las actividades juntos.
A pesar de que no hay fusión se llevará a cabo con la actividad "deliver.Test_DAT_A.20090707.123738" y la actividad "rebase.Test_DAT_B.20090707.125044", que tienen que ser incluidos:

M:\vonc_test_dat_b\adev\test>ct deliver
Changes to be DELIVERED to default target stream in project "Test_DeliverToAlternateTarget":
          FROM: stream "Test_DAT_B"
          TO: stream "Test_DAT_Int"
Using target view: "vonc_test_dat_int".
Activities included in this operation:
        activity:deliver.Test_DAT_A.20090707.123738@\myPVob   vonc        "deliver Test_DAT_A on 07/07/09 12:37:38 PM."
        activity:test_dat_b@\myPVob   vonc        "test_dat_b"
        activity:rebase.Test_DAT_B.20090707.125044@\myPVob    vonc        "rebase Test_DAT_B on 07/07/09 12:50:44 PM."
Do you wish to continue with this deliver operation?  [no]

  Attached activity:
    activity:deliver.Test_DAT_B.20090707.131614@\myPVob  "deliver Test_DAT_B on 07/07/09 1:16:14 PM."
Needs Merge "M:\vonc_test_dat_int\adev\test" [to \main\Test_DAT_Int\CHECKEDOUT from \main\Test_DAT_Int\Test_DAT_B\1 base \main\Test_DAT_
Int\1]
********************************
<<< directory 1: M:\vonc_test_dat_int\adev\test@@\main\Test_DAT_Int\1
>>> directory 2: M:\vonc_test_dat_int\adev\test@@\main\Test_DAT_Int\Test_DAT_B\1
>>> directory 3: M:\vonc_test_dat_int\adev\test
********************************
-----------[ directory 1 ]-------------|---------[ added directory 2 ]---------
                                      -| aFileByB.txt  --07-07T12:50 vonc
*** Automatic: Applying ADDITION from directory 2
Recorded merge of "M:\vonc_test_dat_int\adev\test".
Created branch "Test_DAT_Int" from "M:\vonc_test_dat_int\adev\test\aFileByB.txt" version "\main\0".
Checked out "M:\vonc_test_dat_int\adev\test\aFileByB.txt" from version "\main\Test_DAT_Int\0".
  Attached activity:
    activity:deliver.Test_DAT_B.20090707.131614@\myPVob  "deliver Test_DAT_B on 07/07/09 1:16:14 PM."
Needs Merge "M:\vonc_test_dat_int\adev\test\aFileByB.txt" [to \main\Test_DAT_Int\CHECKEDOUT from \main\Test_DAT_B\2 base \main\0]
Trivial merge: "M:\vonc_test_dat_int\adev\test\aFileByB.txt" is same as base "M:\vonc_test_dat_int\adev\test\aFileByB.txt@@\main\0".

Copying "M:\vonc_test_dat_int\adev\test\aFileByB.txt@@\main\Test_DAT_B\2" to output file.
Deliver has merged
M:\vonc_test_dat_b\adev\test>ct deliver -complete

.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top