我有一个本地TFS 2018并尝试将特定项目从一个项目集合移动到另一个项目集合。由于Microsoft不支持此功能(请参阅用户语音建议here和StackOverflow线程here和here)并且我们需要完全控制,因此我们决定使用REST API以编程方式移动项目。 / p>
所以我构建了一个小型的C#.NET应用程序并包含了Microsoft.TeamFoundationServer.Client NuGet package。一切都按预期工作,我能够将相关项目的完整历史记录重播到另一个项目集合。
不幸的是,我在设置变更集创建日期和作者时遇到了问题。我无法在这里或其他任何地方找到解决方案。
当我设置CreationDate时,该值将被TFS用当前日期覆盖:
TfvcChangeset changeset = new TfvcChangeset()
{
Changes = changes.ToArray(),
Comment = comment,
CreatedDate = sourceChangeset.CreatedDate,
//Author = sourceChangeset.Author,
//CheckedInBy = sourceChangeset.CheckedInBy,
};
TfvcChangesetRef changesetRef = targetVersionControl.CreateChangesetAsync(changeset).Result;
// the resulting changeset reference now has current change date
代码的灵感来自Microsoft sample at GitHub。
当我设置作者或CheckedInBy时(请参阅上面的代码段),ArgumentException
的调用会发生CreateChangesetAsync
:
ArgumentException: The combination of parameters is either not valid or not complete.
(请参阅下面的更新)在我的情况下,我只使用源变更集中的值,因为两个项目集合(源和目标)都是同一个TFS实例的一部分,因此使用相同的标识来自TFS配置数据库。
根据Microsoft documentation,我希望设置这两个值是可能的,尽管文档根本不是很精确。
此外,在签入TFS后,我无法找到更新变更集的解决方案。
注意:我知道有一些现有的软件以移动项目为目标,但它们要么已经过时,要么没有完全正常工作(例如缺少工作项目的移动),要么根据我们的需要进行黑盒化。 / p>
更新:我首先想到的是在同一个不正确的TFS实例的不同集合中重用身份。虽然身份仅存储在TFS配置数据库(tbl_Identities)中,但是本地ID将分配给特定项目集合中的每个使用的身份(项目集合数据库中的tbl_IdentityMap)。所以我创建了两个表的映射来分配目标身份ID而不是源身份ID。我尝试从IdentityRef
获取IdentityHttpClient
,但只获得Identity
个实例,因此我手动创建了IdentityRef
。上述例外情况仍然存在。
// _targetConnection is the VssConnection instance
var targetIdentities = _targetConnection.GetClient<IdentityHttpClient>();
var author = targetIdentities.ReadIdentityAsync(Guid.Parse(targetAuthorId)).Result;
changeset.Author = new IdentityRef()
{
// some properties will remain default, as Identity does not contain
Id = author.Id.ToString("D", CultureInfo.InvariantCulture),
DisplayName = author.DisplayName,
//ImageUrl = author.Properties,
//IsAadIdentity = author.IsAadIdentity,
IsContainer = author.IsContainer,
//ProfileUrl = author.ProfileUrl,
//UniqueName = author..UniqueName,
//Url = author.Url,
};
我还尝试从源变更集的IdentityRef(带有目标项目集合的本地标识ID)创建IdentityRef
但没有成功(仍然是相同的例外)。
答案 0 :(得分:0)
抱歉,它无法通过TFS中的REST API设置/修改变更集作者和日期。这也很容易理解。如果源控制系统很容易改变这个区域, 它似乎有点违反了版本控制。变更集历史记录将不会成为参考值,我们不知道作者和日期是真实的还是时间签入。
Microsoft Docs中也清楚地记录了这一点,请看下面的部分:Using public API-based tools for higher fidelity migration您还在使用API并构建自己的工具。
通常这些工具可以提供比a更高的保真度迁移 手册副本&#34;提示&#34;数据,但它们的保真度仍然相对较低。 例如:
- 他们都不会保留TFVC变更集的日期。
- 其中许多人不会保留工作项修订的更改日期。
- 他们都不会迁移所有TFS工件。