TFS non crea necessariamente unire candidati basati su oggetti ramo per compatibilità all'indietro (gli oggetti ramo erano nuovi in TFS 2010) e per supportare fusioni senza fondamento (una volta eseguita un'unione baseless tra due percorsi, questi verranno archiviati con un unire la relazione per future unioni.)
Suggerirei di utilizzare una politica di check-in personalizzata qui che impone che le unioni passino da Dev -> Test o Test -> Dev e non saltare il livello intermedio. Questo ti permette anche di mantenere Dev come un oggetto branch, così avrai comunque tutte le caratteristiche gradevoli come la visualizzazione branch.
Posso fornire un esempio molto approssimativo, molto pseudo-cody, di ciò che avevo in mente. (È dura sia perché sono pigro, sia perché trascorro il mio tempo nell'SDK Java e non nell'SDK .NET e mi rendo conto che la maggior parte delle persone desidera una politica di archiviazione .NET. Ma soprattutto perché sono pigro.)
/*
* Create a dictionary of merge targets to allowable merge sources.
* For an item in this list, the allowable merge sources are a whitelist.
*/
private readonly Dictionary<String, List<String>> restrictedMergeTargets =
new Dictionary<String, List<String>>();
public static MergeWhitelistPolicy
{
/* Only allowed merges to $/Main from $/Test. */
List<String> mainWhitelist = new List<String>();
mainWhitelist.add("$/Test");
allowedMerges.put("$/Main", mainWhitelist);
/* Only allow merges to $/Test from $/Dev. */
List<String> testWhitelist = new List<String>();
testWhitelist.add("$/Dev");
allowedMerges.put("$/Test", testWhitelist);
}
public PolicyFailure[] evaluate(PolicyContext context)
{
PendingChange[] pendingChanges = GetPendingCheckin().GetCheckedPendingChanges();
foreach(PendingChange change : pendingChanges)
{
if(! change.IsMerge())
{
continue;
}
foreach(KeyValuePair<String, List<String>> restrictedTarget : restrictedMergeTargets)
{
if(VersionControlPath.IsChild(restrictedTarget.GetKey(), change.GetServerItem())
{
/* Whitelisted merge path - investigate. */
foreach(String allowedSource : restrictedTarget.GetValue())
{
foreach(MergeSource mergeSource : change.GetMergeSources())
{
if(! VersionControlPath.IsChild(allowedSource, mergeSource.GetServerItem()))
{
return new PolicyFailure("Merge from " +
mergeSource.GetServerItem() + " to " +
change.GetServerItem() + " is disallowed.");
}
}
}
}
}
}
return null;
}
Ci sono diversi problemi con questo, ovviamente. Certamente non vorrete codificare l'elenco delle relazioni di fusione accettabili nella politica: potreste esternalizzarlo in un file di configurazione, oppure potete interrogare le relazioni di fusione sul server e memorizzarle nella cache se avete regole particolari come solo i discendenti diretti possono fondersi. (La memorizzazione nella cache di questa operazione è importante poiché la valutazione della politica di check-in viene eseguita frequentemente e dovrebbe essere veloce. Può anche essere eseguita occasionalmente sul thread dell'interfaccia utente (sebbene ne dubiti), quindi il tuo chilometraggio può variare.)
Inoltre, my il codice di test del percorso è piuttosto sciatto, principalmente solo per risparmiare spazio nel mio commento. (E anche, la pigrizia di cui sopra da parte mia.)
Spero che questo sia un buon inizio.
Quando dici che non funziona, ricevi un messaggio di errore? L'ho fatto di recente e ho avuto anche me, vedi la "soluzione alternativa" qui: http://connect.microsoft.com/VisualStudio/feedback/details/503673/it-should-be-possible-to-change-branch-relationships -in-TFS-dopo-che-sono-creati. Puoi usare l'opzione "Converti in cartella", come sembra che tu abbia fatto così probabilmente non è così - ha funzionato per me quindi sarei interessato a sentire cosa è successo. – dash
@dash Quando uso "converti in cartella", l'icona cambia ma la relazione rimane. Cioè Posso ancora unire la cartella con il suo ramo padre e l'interfaccia utente unione mostra ancora le 2 relazioni. Vorrei anche ricordare che questo progetto di team è stato recentemente aggiornato da TFS 2008 a TFS 2010 –