TFS API 获取删除文件 - 更新到新版本后的不同行为(从 14xx 到 16xx)

Posted

技术标签:

【中文标题】TFS API 获取删除文件 - 更新到新版本后的不同行为(从 14xx 到 16xx)【英文标题】:TFS API Get Deletes file - Different behavior after update to new version (from 14xx to 16xx) 【发布时间】:2020-02-11 22:37:04 【问题描述】:

我已将 Microsoft.TeamFoundation.VersionControl.Client.dll 从版本 14 (.98.25331.0) 升级到 16 (.149.28804.2 ) 并注意到一个奇怪的行为。我不确定这是预期的还是错误。

考虑这种情况:

用户有一个映射到本地路径的服务器工作区。

用户对文件进行签出,意识到这不是故意的并执行撤消。然后,他将该文件与另一个文件进行比较(这通过在 appdata 上创建一个新工作文件夹、映射它并将文件获取到该位置来实现)。这以前工作正常,本地路径上的初始文件没有被触及并保留在那里。

升级到版本 16(.149.28804.2) 后,本地文件夹中的“旧”文件将在获得文件到新的临时路径后立即删除强>。

这是故意的还是一个错误?

我不确定代码在这种情况下是否有帮助,无论如何我都会提供它

workSpace.Undo(undoFiles, RecursionType.OneLevel, false);

Related MSDN documentation 用于撤消。

workSpace.Get(getFiles, VersionSpec.Latest, RecursionType.OneLevel, GetOptions.None);

Related MSDN documentation 获取。

有什么想法吗?


编辑:

经过一番调查,这似乎是故意的。使用 2017 VS 的tf.exe,出现replacing ... (moved from xx) 行。好像就该这样。不过对我没有帮助。


编辑 2:

我找到了问题的原因(或者说是预期的行为)。 在 Microsoft.TeamFoundation.VersionControl.Client.dll 中有这段代码

if (asyncGetFileState.m_existingLocalExists && asyncGetFileState.m_action.CurrentLocalItem != null && !FileSpec.Equals(asyncGetFileState.m_action.CurrentLocalItem, asyncGetFileState.m_action.TargetLocalItem))
   
    asyncGetFileState.m_client.DeleteSource(asyncGetFileState.m_action, asyncGetFileState.m_existingLocalAttrs);

注意属性CurrentLocalItemTargetLocalItem。 由于CurrentLocalItem 仍然指的是原始位置,而TargetLocalItem 指的是临时文件夹,因此正在删除原始位置中的文件。 两个版本都会出现这种情况,似乎我们在以前的版本中从未注意到它。

但是,可能有一种方法可以更新缓存,以便 CurrentLocalItem 也引用 TargetLocalItem 所引用的同一位置,这样我的原始文件就不会被删除。我会尽快调查的。

【问题讨论】:

抱歉,没有完全明白你的意思,尤其是关于临时路径。您能否提供重现您的问题或相关屏幕截图的详细步骤?您最初的问题是关于撤消/获取文件的客户端 api,但您的更新是指 tf.exe @PatrickLu-MSFT 我使用tf.exe 只是为了验证它是否仅在我的代码中发生,如果它也与tf.exe 一起发生 - 就是这种情况。我也找到了问题的原因,请参阅我的帖子中的更新。评论中没有足够的空间容纳整个描述。 嗨 Trexx,感谢您的详细分享。自己修复总是更好;正如您了解它是如何工作的!:) 无论如何,您能否将您的编辑 2 移至以下回复和 mark your reply as an answer,这也将有助于社区中的其他人。以防他们下次遇到同样的问题。 【参考方案1】:

按照建议,我会将我的最终编辑作为答案。

我找到了问题的原因(或者说是预期的行为)。 在 Microsoft.TeamFoundation.VersionControl.Client.dll 中有这段代码

if (asyncGetFileState.m_existingLocalExists && asyncGetFileState.m_action.CurrentLocalItem != null && !FileSpec.Equals(asyncGetFileState.m_action.CurrentLocalItem, asyncGetFileState.m_action.TargetLocalItem))
   
    asyncGetFileState.m_client.DeleteSource(asyncGetFileState.m_action, asyncGetFileState.m_existingLocalAttrs);

注意属性CurrentLocalItemTargetLocalItem。 由于CurrentLocalItem 仍然指的是原始位置,而TargetLocalItem 指的是临时文件夹,因此正在删除原始位置中的文件。 两个版本都会发生这种情况,似乎我们从未注意到以前的版本。

一个可行的解决方案是重命名原始文件并在将其放入临时文件夹后恢复名称。

但是,可能有一种方法可以更新缓存,以便 CurrentLocalItem 也引用 TargetLocalItem 所引用的同一位置,这样我的原始文件就不会被删除。如果我能找到更好的解决方案,我会调查并更新我的答案。

【讨论】:

以上是关于TFS API 获取删除文件 - 更新到新版本后的不同行为(从 14xx 到 16xx)的主要内容,如果未能解决你的问题,请参考以下文章

Cocos Creator 热更新 [Lv.1]

Cocos Creator 热更新 [Lv.1]

Google Play应用 “更新被拒“ 后续处理 ( 上传新版本后 , 一定要停用被拒的版本, 才可以通过审核 | 停用被拒的版本 | 送审 )

发布我的应用的新版本后,Firebase 数据未导出到 BigQuery

AWS Elastic Beanstalk - PHP 脚本在部署新版本后无法执行

安装后MSI安装程序删除目标文件夹