不使用svn忽略特定目录或文件:ignore

Ben*_*Ben 8 svn tortoisesvn

出于某种原因,没有人svn:ignore在我们的存储库中设置了不错的属性,当我询问它时,响应是"之前没有人抱怨过这种情况,你不能只是放弃'未版本控制的项目'吗?" (我们几乎全球使用TortoiseSVN).

我是团队的新手,所以我想设置一些本地忽略列表,而不是无情地更改存储库.

我知道全局忽略列表,但全局忽略列表不接受特定路径,只接受简单的单级文件模式.我读了一个关于本地忽略列表的问题,但这个问题实际上并不是要求"忽略"未版本控制的文件,而是实际上要求阻止对特定版本化文件的提交.我读了另一个关于忽略本地目录的问题,就像我想做的那样,但是该问题上接受的答案使用了全局忽略列表,由于无法在我的工作副本中指定特定路径,因此对我无效.

我可以svn:ignore在本地设置一些属性,但无法将目录添加到更改列表(如上面的问题中建议的,以避免提交版本化文件),因此我不小心提交了这些更改.

有没有办法在本地忽略我的工作副本树中的特定无版本目录或文件,而不使用svn:ignore


更新:当前的最佳答案让我非常接近我想要的.它允许我在"检查修改"或"提交"对话框中过滤掉任意文件.但是,如果我想包含目录更改(即更改目录的版本化属性),那么TortoiseSVN也会自动包含目录下的所有文件(即我不能在列表中包含目录,过滤掉目录下的文件) ).

cok*_*n19 5

我无法找到一种无缝的方式来完成你正在寻找的东西,但我确实找到了一个可能适合你需求的选项,考虑到这是你想要的本地机器.

可以手动调用TortoiseSVN Commit对话框,为其提供搜索要提交的文件的路径,如下所示:

C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe /command:commit /pathfile:"<a file containing paths>"
Run Code Online (Sandbox Code Playgroud)

因此,既然您知道要忽略哪些目录和文件,则可以提供仅包含要提交的目录和文件的路径文件.

请记住,路径文件必须采用UTF-16(little-endian)编码,没有 BOM.路径由换行符分隔.您可以创建这样一个有效的路径文件(在C#中),如下所示:

string[] paths = { @"c:\code\1\dir1", @"c:\code\1\dir2", @"c:\code\1\dir3\file1.txt" };
UnicodeEncoding encoding = new UnicodeEncoding(false, false);
System.IO.File.WriteAllText(@"C:\temp\pathslist.txt", string.Join("\n", paths), encoding);
Run Code Online (Sandbox Code Playgroud)

在我对路径的实验中,支持目录和文件路径,但不支持通配符,因此在生成路径文件时需要进行任何过滤.

有几个额外的命令行选项TortoiseProc /command:commit,您可以在此处找到.

相同的方法适用于"检查修改",替代/command:repostatus代替/command:commit.综上所述:

  1. 创建一个抓取所有感兴趣的文件名的脚本
  2. 过滤掉所有不感兴趣的文件名(可能来自计算机某处的"忽略文件").
  3. 以UTF-16 LE格式(无BOM)写入文件列表.
  4. 使用/pathfile指定文件列表和/commandrepostatus或commit 的参数调用TortoiseProc .
  5. (可选)删除文件列表.

可选 - 使用钩子脚本与"提交"集成

顺便说一句,我确实通过在Settings中使用TortoiseSVN Hook Script选项找到了一条"集成"路径.它仍然使用上面的TortoiseProc过程,但另外提供了一种仍然使用TortoiseSVN Commit上下文菜单的方法(有一个怪癖).

用于钩子脚本的特定语言并不重要,只是它能够处理命令行参数并返回退出代码.从文档(这里):

这可以是批处理文件,可执行文件或具有有效Windows文件关联的任何其他文件,例如perl脚本.

对于这个例子,我使用了C#:

static void Main(string[] args)
{
    // Process the three command-line arguments
    string PATH = args[0]
        , MESSAGEFILE = args[1]
        , CWD = args[2];

    const string tortoiseProcPath = @"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe";
    const string someArgForOurUse = @"/2E040D90-E3AD-4AC5-AA46-E6D9F1034E55";
    const string wantedPathsFile = @"C:\temp\svn_paths_list.txt";

    //System.Diagnostics.Debugger.Launch();

    System.Diagnostics.Process parentProc = ParentProcessUtilities.GetParentProcess();

    // If the parent process isn't what is expected or it has the proprietary argument then exit.
    if ((parentProc == null) || (!parentProc.MainModule.FileName.Equals(tortoiseProcPath, StringComparison.InvariantCultureIgnoreCase))
        || GetProcessCommandLine(parentProc.Id).Contains(someArgForOurUse))
        return;

    // Read all selected path from passed-in the temp file
    // Each line contains a file/directory selected in Explorer
    string[] fileLines = System.IO.File.ReadAllLines(PATH);
    IEnumerable<string> wantedPaths = GetWantedPaths(fileLines);

    UnicodeEncoding encoding = new UnicodeEncoding(false, false);
    System.IO.File.WriteAllText(wantedPathsFile, string.Join("\n", wantedPaths), encoding);

    System.Diagnostics.Process.Start(tortoiseProcPath, "/command:commit /pathfile:\"" + wantedPathsFile + "\" " + someArgForOurUse);

    Console.Error.WriteLine("Don't worry.  Everything will be ok.");
    Environment.Exit(1);
}

private static IEnumerable<string> GetWantedPaths(string[] selectedPaths)
{
    // Do whatever you want here to filter directories and files
    return selectedPaths;
}

// Add System.Management reference
private static string GetProcessCommandLine(int processId)
{
    System.Management.SelectQuery wmiQuery = new System.Management.SelectQuery("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + processId.ToString());
    System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(wmiQuery);

    foreach (System.Management.ManagementObject obj in searcher.Get())
        return obj["CommandLine"].ToString();
    return null;
}
Run Code Online (Sandbox Code Playgroud)

为了简洁起见,ParentProcessUtilities.GetParentProcess我可以在这里找到我从另一个SO帖子中使用的内容.

说明:

PATH输入参数指向一个临时文件,其中包含在资源管理器中选择的所有目录和文件.从中,您可以构建所需路径列表.构造列表并将其写入文件后,我们重新启动TortoiseProc,将新文件作为参数传递,以及可用于跟踪的专有参数.

最后,我们返回一个非0的退出代码,这会阻止原始的TortoiseSVN提交窗口出现,但需要注意一点.将出现"错误"对话框,显示写入stderr的消息; 我所说的怪癖.此代码中最重要的部分之一是在实际执行所有这些工作之前检查专有参数的父进程.此检查可防止挂钩无限次运行,因为当上述代码重新启动TortoiseProc时,将再次触发挂钩脚本,然后再次调用此代码.

我还研究了原来传入的PATH文件的内容是否可以在适当的位置进行更改,但它不能.遗憾的是,TortoiseSVN只是为了钩子脚本而显式输出的文件,然后将其删除.也许这可能是未来的特色.