2012-02-27 3 views
5

Мы довольно большой проект с одной ветвью ствола. Большинство из них использует разрешения по умолчанию, но несколько папок имеют пользовательские разрешения - скажем, только регистрация группы «Builders» разрешена.Очистка специальных разрешений от папок в филиале

Мы хотим, чтобы люди могли создавать свои собственные частные ветки из ствола, где они могут свободно регистрироваться и сливаться позже (надеюсь, часто). Однако, создавая ветвь, специальные разрешения копируются вместе с папками, что означает, что люди не могут свободно регистрироваться в своей ветке.

  • Есть ли способ очистить специальные разрешения от ветки или папки?
  • Есть ли способ сделать это автоматически, поэтому любой, кто создает ветвь под/private/**, не столкнется с этой проблемой?

ответ

6

Я узнал о tf permission (пример: tf permission /inherit:yes itemSpec). Однако, рекурсивный переключатель не работает с ним. Я предполагаю, что я мог бы написать что-то, что работает рекурсивно ...

Edit: я наконец удосужился писать инструмент для этого:

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

Спасибо за это, я только что провел час, пытаясь для удаления ветки из-за какого-то глупого явного разрешения. Эта треска исправила ее за 2 секунды :) – DaveShaw

+0

Где вы выполняете этот код? Можете ли вы рассказать, как вы его используете? Я застрял в том, что, по моему мнению, похоже на то, что некоторые папки разрешают мне удалять или переименовывать ветку. –

+0

@ mats-isaksson создать новое консольное приложение –

Смежные вопросы