You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TFS 2018:如何通过REST API设置变更集的作者与日期?

解决TFS 2018迁移时设置变更集作者与日期的问题

首先得明确TFS的核心限制:默认情况下,变更集的创建日期是系统自动生成的,无法直接通过公开API修改;而变更集的作者则由提交时的用户身份决定。不过结合你已经搭建的C#应用和Microsoft.TeamFoundationServer.Client包,我们可以通过两种方式来满足完整迁移历史的需求:

一、模拟原作者提交变更集(实现正确的作者显示)

要让目标变更集的作者与源集合完全一致,你需要先确保迁移工具使用的账户拥有**“模拟其他用户”**的权限(在TFS服务器或集合的权限设置中开启)。之后在提交每个变更集前,切换到原作者的身份进行认证:

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using System.Net;

// 1. 定义目标集合地址和原作者的身份信息
Uri targetCollectionUri = new Uri("http://your-tfs-server:8080/tfs/TargetCollection");
NetworkCredential authorCreds = new NetworkCredential("source-author-username", "password", "domain");

// 2. 以原作者身份连接到TFS
TfsTeamProjectCollection tfsCollection = new TfsTeamProjectCollection(targetCollectionUri, authorCreds);
tfsCollection.EnsureAuthenticated();
VersionControlServer versionControl = tfsCollection.GetService<VersionControlServer>();

// 3. 构建待提交的变更(替换成你从源集合获取的实际变更内容)
PendingChange[] pendingChanges = GetPendingChangesFromSource();

// 4. 提交变更集,此时变更集的作者会显示为原作者
int newChangesetId = versionControl.CheckIn(pendingChanges, $"迁移自源集合变更集:{sourceChangesetId}");

注意:如果源项目涉及多个不同作者,你需要为每个作者的变更集单独认证提交,这在迁移工具中可以通过循环处理实现。

二、保留原变更集日期(两种可选方案)

由于TFS不允许通过公开API修改变更集的系统创建日期,这里提供两个可行方案:

方案1:添加自定义属性存储原日期

通过客户端对象模型为目标变更集添加自定义属性,存储源变更集的原始日期,后续可以通过API或TFS界面的属性查看器获取原日期信息:

// 获取刚创建的目标变更集
Changeset newChangeset = versionControl.GetChangeset(newChangesetId);

// 设置自定义属性存储原创建日期
string originalDate = sourceChangeset.CreationDate.ToString("yyyy-MM-dd HH:mm:ss");
versionControl.SetChangesetProperty(newChangesetId, "Migration.OriginalCreationDate", originalDate);

方案2:通过高权限REST API尝试修改系统日期(不推荐)

如果你拥有TFS服务器的管理员权限,可以尝试通过REST API的PATCH请求修改变更集的系统日期,但这属于半公开操作,可能影响TFS稳定性,务必先在测试环境验证:

using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;

// 构建PATCH请求的内容
var patchContent = new
{
    createdDate = sourceChangeset.CreationDate.ToString("o") // 使用ISO 8601格式日期
};

// 发送PATCH请求到TFS REST API
using (HttpClient client = new HttpClient())
{
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    // 添加管理员账户的认证信息
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("admin-username:password")));

    string apiUrl = $"{targetCollectionUri}/_apis/tfvc/changesets/{newChangesetId}?api-version=4.1";
    var response = await client.PatchAsync(apiUrl, new StringContent(JsonConvert.SerializeObject(patchContent), Encoding.UTF8, "application/json"));
    
    if (!response.IsSuccessStatusCode)
    {
        string errorMsg = await response.Content.ReadAsStringAsync();
        throw new Exception($"修改日期失败:{errorMsg}");
    }
}

关键注意事项

  • 权限要求:模拟用户需要“模拟其他用户”权限,修改变更集属性需要项目集合管理员或更高权限。
  • 数据一致性:迁移前务必在测试环境验证所有流程,避免破坏目标集合的数据。
  • 版本兼容性:以上操作针对TFS 2018,不同版本的API或客户端对象模型可能存在差异。

内容的提问来源于stack exchange,提问作者Sebastian Hübner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:43:57