2012-02-27 13 views
5

Siamo un progetto abbastanza grande con un singolo ramo di linea. La maggior parte utilizza le autorizzazioni predefinite, ma alcune cartelle hanno permessi personalizzati - ad esempio, solo il gruppo "Builders" può effettuare il check-in.Eliminazione delle autorizzazioni speciali dalle cartelle in un ramo

Vogliamo consentire alle persone di creare le proprie filiali private fuori dal bagagliaio, dove possono liberamente effettuare il check-in e unirsi successivamente (si spera spesso). Tuttavia, creando un ramo, le autorizzazioni speciali vengono copiate insieme alle cartelle, il che significa che le persone non possono effettuare liberamente il check-in nel loro ramo.

  • C'è un modo per cancellare permessi speciali da un ramo o una cartella?
  • C'è un modo per farlo automaticamente, quindi chiunque crei un ramo sotto/private/** non incontrerà questo problema?

risposta

6

ho scoperto tf permission (Esempio: tf permission /inherit:yes itemSpec). Tuttavia, l'opzione/ricorsiva non funziona con esso. Credo che avrei potuto scrivere qualcosa che lo gestisce in modo ricorsivo ...

Edit: finalmente ho il tempo di scrivere uno strumento per esso:

static int Main(string[] args) 
{ 
    if (args.Length == 0 || args.Any(a => !a.StartsWith("$/"))) 
    { 
     Console.WriteLine("Removes all explicit permissions and enables inheritance for a subtree.\n" 
         + "Example: " + Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location) + " $/project/path1 $/project/path2"); 
     return 3; 
    } 

    WorkspaceInfo wi = Workstation.Current.GetLocalWorkspaceInfo(Environment.CurrentDirectory); 
    if (wi == null) 
    { 
     Console.WriteLine("Can't determine workspace for current directory: " + Environment.CurrentDirectory); 
     return 2; 
    } 

    var Tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(wi.ServerUri); 
    VersionControlServer VersionControlServer = Tfs.GetService<VersionControlServer>(); 

    Console.WriteLine("Server: {0} Getting permissions...", wi.ServerUri); 
    ItemSecurity[] perms = VersionControlServer.GetPermissions(args, RecursionType.Full); 

    Console.WriteLine("Will remove explicit permissions from the following items:"); 

    var changes = new List<SecurityChange>(); 
    foreach (ItemSecurity perm in perms) 
    { 
     Console.WriteLine(" " + perm.ServerItem); 

     changes.Add(new InheritanceChange(perm.ServerItem, inherit: true)); 
     foreach (AccessEntry e in perm.Entries) 
     { 
      changes.Add(new PermissionChange(perm.ServerItem, e.IdentityName, null, null, PermissionChange.AllItemPermissions)); 
     } 
    } 

    Console.WriteLine("Enter to confirm:"); 
    Console.ReadLine(); 

    var successfulchanges = VersionControlServer.SetPermissions(changes.ToArray()); 
    if (successfulchanges.Length == changes.Count) 
    { 
     Console.WriteLine("Explicit permissions removed from all items"); 
     return 0; 
    } 
    else 
    { 
     Console.WriteLine("Explicit permissions removed only from:"); 
     foreach (var c in successfulchanges) 
     { 
      Console.WriteLine(" " + c.Item); 
     } 

     return 1; 
    } 
} 
+3

Grazie per questo, ho appena trascorso un'ora cercando per eliminare un ramo a causa di un permesso esplicito sciocco. Questo cod lo ha risolto in 2 secondi :) – DaveShaw

+0

Dove esegui questo codice? Puoi dire come lo usi? Sono bloccato con quello che credo sia una cosa simile con il permesso di alcune cartelle che mi impedisce di cancellare o rinominare un ramo. –

+0

@ mats-isaksson crea una nuova applicazione console –

Problemi correlati