2012-02-27 35 views
5

Somos un proyecto bastante grande con una única rama de enlace troncal. La mayoría utiliza los permisos predeterminados, pero algunas carpetas tienen permisos personalizados, por ejemplo, solo el grupo "Constructores" puede realizar el check-in.Borrando permisos especiales de carpetas en una rama

Queremos permitir a las personas crear sus propias ramas privadas fuera del tronco, donde pueden registrarse y fusionarse más tarde (con suerte). Sin embargo, al crear una rama, los permisos especiales se copian junto con las carpetas, lo que significa que las personas no pueden registrarse libremente en su sucursal.

  • ¿Hay alguna manera de borrar los permisos especiales de una rama o una carpeta?
  • ¿Hay alguna manera de hacerlo automáticamente, por lo que cualquiera que cree una rama en/private/** no encontrará este problema?

Respuesta

6

Me enteré tf permission (Ejemplo: tf permission /inherit:yes itemSpec). Sin embargo, el modificador/recursivo no funciona con él. Creo que podría escribir algo que se ejecuta de forma recursiva ...

Editar: fin llegué alrededor de escribir una herramienta para ello:

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

Gracias por esto, me acaba de pasar una hora tratando para eliminar una rama debido a algún permiso explícito tonto. Este bacalao lo arregló en 2 segundos :) – DaveShaw

+0

¿Dónde ejecutas este código? ¿Puedes decirnos cómo lo usas? Estoy atrapado con lo que creo que es algo similar con el permiso de algunas carpetas que me impide borrar o cambiar el nombre de una rama. –

+0

@ mats-isaksson crea una nueva aplicación de consola –

Cuestiones relacionadas