2

我在 tfs 工作区中有一个本地文件夹并使用 TFS-API。

每天晚上我都会删除这个文件夹,然后将数据库脚本作为 .sql 文件。如果现在添加或编辑了某些内容,则将找到更改并进入待处理的更改以进行签入。

问题是我如何使用 TFS-API 检测文件丢失(故意,因为不再在数据库中并且因为不再编写脚本)。第一步很明显,删除空文件夹中的所有文件和脚本。

我在开始时使用 workspace.PendEdit,这使我能够从外部覆盖文件。数据库脚本编写完成后,我将做一个workspace.PendEdit 和workspace.PendAdd。

这按预期工作。但是 workspace.PendDelete 没有找到已删除的文件,因此无法将这些已删除的文件添加到挂起的更改中。

tfs 的 power tools 有一个命令行工具,它有一个在线标志,应该这样做,我想要什么。

我的问题:有可能吗,我用 tfs-api 描述了什么?如果这不起作用,有没有人体验过这个在线标志?


简单示例

我在本地文件夹中有两个文件:1.sql 和 2.sql 这两个文件最初是签入的。

我在本地删除 2.sql(不了解 tfs)我添加一个文件:3.sql 我编辑 1.sql

现在,我使用 workspace.PendEdit 和 workspace PendAdd 来检测编辑和添加的文件。这些文件将被很好地检测到。

问题来了: 2.sql 缺失的删除将不会被检测到,因此无法在服务器上删除。

那么:如何在不了解 tfs 的情况下检测丢失的文件/本地删除的文件?

我希望这能澄清我的问题。

伪代码示例:

DeleteWorkspaceFolderContent(); // Because i do not delete but regenerate my Sql scripts.
GenerateSqlScriptsToWorkspaceFolder(); // .sql files are generated to the same folder, they were deleted before

// 现在在这一点上,我做了workspace.PendAdd(localPath, true);workspace.PendEdit(localPath, RecursionType.Full);它的工作就像一个 sharm,所以新的 .sql 文件将等待添加和编辑(真正更改的脚本)等待“change-Checkin”。

// 在这一点上,我会workspace.PendDelete(new [] { localPath }, RecurstionType.Fulll);做同样的事情:看到一个文件在本地丢失,然后在服务器上挂起这个文件以进行删除。但这不会发生。未添加待定更改。

var pendingChanges = workspace.GetPendingChanges(localPath, RecursionType.Full);

workspace.CheckIn(pendingChanges, "Per TFS-API, " + DateTime.Now.ToString());
4

1 回答 1

4

您真正想要做的是使用本地工作区并让 TFS 为您处理这个问题。它将检测文件的修改、添加和删除,并自动为您挂起。

如果您想为此使用 TFS API,那么您将需要检查您的“候选待定更改”(TFS 客户端已确定磁盘上存在的那些),然后将它们提升为实际的待定更改。例如:

PendingChange[] candidates;
workspace.GetPendingChangesWithCandidates(
    new ItemSpec[] { new ItemSpec(@"C:\Local\Path", RecursionType.Full) },
    false,
    out candidates);

foreach (PendingChange pc in candidates)
{
    if ((pc.ChangeType & ChangeType.Delete) == ChangeType.Delete)
    {
        workspace.PendDelete(pc.LocalItem);
    }
    else if ((pc.ChangeType & ChangeType.Add) == ChangeType.Add)
    {
        workspace.PendAdd(pc.LocalItem);
    }
    else
    {
        workspace.PendEdit(pc.LocalItem);
    }
}

PendingChange[] changes = workspace.GetPendingChanges();

/* Now you can review and CheckIn your changes. */

如果您不能这样做(因为您正在运行旧版本的 TFS 或 Visual Studio,或者出于其他原因),那么您应该只使用TFS Power Tools并运行tfpt online.

如果您真的非常想为此使用 TFS API,那么您只需执行tfpt online命令执行的操作:

  1. 扫描整个本地工作文件夹映射
  2. QueryItems针对本地工作文件夹映射运行
  3. 对于本地项目中存在但服务器上不存在的任何文件,请挂起添加
  4. 对于存在于服务器项中但不存在于本地文件系统中的任何文件,挂起删除
  5. 对于任何其他项目,确定它是否可写。如果是这样,请挂起编辑。(注意,您可能希望检查文件的 MD5 哈希,以确定它是否被实际编辑或只是标记为可写。)
于 2014-07-28T14:04:21.503 回答