English 中文(简体)
TFS:如何在批处理文件中取消未修改文件的签出。
原标题:
  • 时间:2009-02-13 00:44:50
  •  标签:

我们使用批处理文件来生成代码,并自动从Team Foundation Server(TFS)签出生成的文件,以便重新生成它们。其中大部分文件未经修改,但生成器事先不知道这一点。

“tfs undo” 命令会撤销检出,但如果某些文件已经修改,则会提示(我们不希望这样)。我们也不希望立即检入生成的文件。

有没有一个命令(或一系列命令)来无需提示用户撤消所有未修改文件的检出?

最佳回答

请查看2011年8月的Team Foundation Server Power Tools中的取消未更改命令。

c:myProject> tfpt uu . /noget /recursive

感谢Matt Florence更新链接。

感谢Ray Vega提供实际语法

问题回答

安装Team Foundation Server Power Tools,并在使用tfpt.exe从您的项目工作空间目录的根目录中运行以下命令。

c:myProject> tfpt uu。/noget /recursive

包括使用/noget被强烈推荐,因为它可以防止强制获取所有项目文件的最新版本,这会根据文件数量而非常耗时。

谢谢@mike和@ray,

我希望能让它更容易。

在VS中,通过 "工具" 菜单,点击 "外部工具"。

这个图片无法翻译,因为它是一个图像文件。

点击添加。

输入标题。

指令:tfpt.exe

争议:uu ./noget /递归

初始目录:[您可以从箭头按钮中选择]。

撤销方案中未更改部分

撤销未更改的项目。

工具菜单中添加了两个新命令。

需要时使用它们。

享受 (xiǎng shòu)

Ofir(奥菲尔)

  1. Right-click on your project
  2. Select undo checkout, then just click okay, or whatever confirmation is left...
  3. Then, while undoing checkout, for every file that has REAL changes in it, a prompt will ask you to confirm the check out for that file... simply click "No to All"

Visual Studio 会知道检出的文件是否有更改。

警告:此方法也会删除尚未检入TFS的文件。如果您想保留这些文件,则只需将它们从您要“取消”的文件集中排除即可。

更新此问题的答案,只适用于使用TFS2017VS2017/VS2019的情况。

电源工具不存在于TFS 2017中,旧的工具也无法和它很好地协同工作,但显然大部分功能已经移植到了VS2017本身或插件中(见下文)。

Visual Studio 2017/2019 Extension

某些操作,如撤销未更改文件,已移动到某处。

Visual Studio 2017的扩展程序。

VS2019的扩展插件

“撤消并未更改”按钮位置:”

将此翻译成中文:undo unchanged button location 撤销未更改按钮位置

Known bug

You have to open the Source Control Explorer (and leave it open) so that the Undo Unchanged is displayed in the Action menu of the Pending Changes view. reported here.

Windows Shell Integration Extension

另外,您仍然可以通过一个独立的安装程序来设置Windows shell集成,该安装程序不再与TFS Power Tools相关联。

Windows shell 集成不会与 powertools 完全相同,但最重要的操作对我来说有效。

如果您只是再次检查所有已经检出的文件,TFS 就足够聪明以确定哪些文件被更改,只在服务器上记录更改集中包括它们。

TFS通过比较提交前后文件内容的MD5散列值来实现此功能。

这一切都是基于您的生成过程纯粹是更新相同文件集的情况下。也就是说,在下一次生成过程中,您永远不会遇到先前生成的文件不再需要的情况(即你会想要删除该文件)或者这些文件更改了名称。

如果您的过程有可能需要删除文件,则最好查看Team Foundation Power Tools命令(tfpt)并使用tfpt在线命令,它将只检查已更改的文件,并且足够聪明,可以为任何不再需要或更改名称并且需要添加的文件挂起删除。

祝你好运。

马丁。

注意,TFS 撤销操作不会恢复文件系统的“修改日期”值。这很令人沮丧,尤其是如果您使用像 robocopy 这样的工具来同步远程机器。即使您撤销了您的检出,如果您保存了文件并更新了“修改日期”值,那么更新后的值仍会保留,即使您撤销了该文件的检出。

对于 tfpt 的 uu 选项(大多数其他答案中推荐的),我最初并不清楚有几个要点。首先,这是可以通过命令tfpt uu /?访问的命令行帮助。

Undoes redundant pending changes. If the state of an item with a pending change is the same as on the server, then the change is undone.

Usage: tfpt uu [/changeset:changesetnum] [/recursive] [/noget] [filespec...]

  • /changeset Compare the workspace to item states at the changeset version specified instead of the latest version
  • filespec... Only check the listed filespecs for redundant changes
  • /recursive Check the specified filespecs with full recursion
  • /noget Do not run get before checking

/changeset 选项不可与 filespecs 或 /recursive 一起使用。

现在让我分解一下其他答案中推荐的命令。

tfpt uu . /noget /recursive
  • tfpt uu specifies that we wish to use the Undo Unchanged command.
  • . indicates (I guess) that the current working directory should be used as the filespec.
  • /noget ensures that get latest version is not called before undoing the unchanged files.
  • /recursive ensures that not just the filespec will be considered but all recursive child folders and files. This seems to be dependent on the filespec - if there is none provided then the whole workspace is processed.

关于上述命令,有几点需要注意... (Guānyú shàngshù mìnglìng, yǒu jǐ diǎn xūyào zhùyì...)

  • It is dependent on the working directory.
  • It does not process the entire workspace.

我已经发现以下命令对我最有效- 它将处理整个工作区。

tfpt uu /noget 的中文翻译为:tfpt uu /noget。

请注意,tfpt仍然依赖于工作目录,以确定应该处理哪个工作区。但是只要您提供了工作区中文件或文件夹的路径,您就可以开始了。

我可以看到Ray LionFang的做法在上面。由于声誉不够,无法在那里发表评论。虽然我喜欢这种方法,因为不需要对工具等进行任何更改……

  1. Right-click on your project
  2. select undo checkout, then just click okay, or whatever confirmation is left...
  3. then, while undoing checkout, for every file that has REAL changes in it, a prompt will ask you to confirm the check out for that file... simply click "No to All"
  4. Visual studio will know if the checked out file has changes or none. Be aware that this method also removes added files that are not yet checked in from TFS...

这种方法存在问题,即点击“全部拒绝”会保留一些未修改的文件。它似乎会撤销未修改的文件,直到它遇到第一个实际修改的文件,然后忽略其余未修改的文件,如果这样说有任何意义的话。我只在偶尔看到这种效果。

一个潜在的解决方法是按照上述步骤进行操作,但是在点击"No To All"之前,对于每个文件都点击"No"。由于这可能需要一些时间取决于你正在处理的文件数量,所以我通常会按住"ALT + N"键,这样它就会快速浏览所有文件并撤消所有未修改的文件。

我来晚了一点,但如果您可以控制批处理脚本,您可以在生成过程中检出任何文件,然后运行类似以下的内容:

tf reconcile [path-to-local-folder] /promote /adds /deletes /recursive

请确保您仅检查您打算签入的文件。您可以在此阅读有关协调命令及其语法的更多信息:

将此翻译成中文:https://learn.microsoft.com/en-us/azure/devops/repos/tfvc/reconcile-command https://learn.microsoft.com/zh-cn/azure/devops/repos/tfvc/reconcile-command

我发现最安全,最快的方式既不会导致 Visual Studio 崩溃,也不会花费很长时间,那就是:

1- 打开开发者命令提示符。您可以从Visual Studio中进行操作,在顶部的搜索框中键入“开发者命令提示符”。

2- 使用以下命令获取所有已签出文件的状态:

tf status "$/" /s:tfs /recursive /format:detailed

3- Then you ll get a list of similar items to the following: enter image description here

然后从图1中复制您想要批量撤消所有内容的目录路径。在下面的命令中,将其填入双引号之间而不是PUT_1_HERE。对于2和3也是如此,但不要使用双引号。

tf undo "PUT_1_HERE" /workspace:PUT_2_HERE;PUT_3_HERE /recursive

4- 执行该命令,不管要撤销的文件数量有多大,都应该在几秒钟内完成。





相关问题
热门标签