有没有一种方法可以在TortoiseSVN中“部分地”提交文件?

49
我想使用TortoiseSVN只提交文件的部分内容,有办法实现吗? 我举个例子来说明我为什么要这样做。 我有一个文件,其中包含一些定义,在构建过程中会被替换,就像这样:
#define SOME_PATH "[SOME_PATH]"

在构建过程中,这个[SOME_PATH]标记会被替换,但是当我在编码时,我必须更改它以适应我的机器上的实际路径。

因此,每次提交时,我需要备份一些行,还原它们,提交,然后恢复备份,这有点麻烦。

有没有办法告诉TortoiseSVN忽略某些更改,比如X、Y和Z行?

8个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
76

这篇最高票答案已经过时了。

从tortoiseSVN网站获取: http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-dug-commit.html

仅提交文件的部分内容

有时您只想提交对一个文件所做更改的某些部分。这种情况通常发生在您正在处理某件事情,但是需要提交一项紧急修复,并且该修复恰好位于您正在工作的同一文件中。

右键单击文件,使用上下文菜单 → 提交后还原。这将创建一个文件的副本。然后您可以编辑文件,例如在TortoiseMerge中撤销所有不想提交的更改。保存这些更改后,您就可以提交文件。

提交完成后,文件的副本会自动恢复,您将拥有文件中所有未被提交回去的修改。


6
TortoiseSVN让这个过程变得太复杂了。信息已经存在,所以执行“逐行”提交或搁置只需要进行底层操作即可。或者有其他原因吗? - Martin Hoza
6
我的TortoiseSVN中没有“提交后还原”选项在右键菜单中。 - user1451111
5
您需要在“提交”窗口内右键单击该文件,然后在上下文菜单中应该能看到它。 - jewbix.cube
很遗憾地,TortoiseMerge似乎不再适用于挑选行的目的了。出于某种原因,尽管它显示了更改,但不再有撤销单个更改的选项(是的,我在功能区中“启用编辑”)。 - Ben Voigt

12

不,Subversion 是在文件级别上工作的。


那正是我所担心的 :( - Fabio Gomes
13
这个答案已不再正确。请参考@Greylander的答案 - Otiel

7

不。

最好的方法是检查一些文件,例如“build_paths.h.default”,然后在每个构建平台上将其复制到build_paths.h中,进行修改以适应,然后告诉SVN忽略build_paths.h。最后,在程序中#include“buiild_paths.h”。


6
一般来说是可以的!在最新版本的Tortoise SVN(1.8)中添加了功能。请参见发布说明。不幸的是,这是一个手动过程,可能不太适合您特定的用例,更适用于“我正在开发一个新功能,发现了一个错误,并想要提交修复错误”的情况。 对于您的情况,我使用模板文件,在构建过程中使用该文件创建实际使用的文件(该文件仅从模板文件创建,没有其他内容)。我将模板文件放在svn中,但忽略了实际文件。这意味着我只需要在新的checkout后构建一次,然后我的工作副本就可以正常工作,但标记的值不会被提交。如果我需要添加新的标记,我会在模板文件中进行添加,然后重新构建我的工作副本。

1
@alroc:回复5年前的内容没有问题(巧合的是,当我在搜索这个功能并找到这个问题时,又过去了5年,自从这个答案和你的评论被写下来 :))。毕竟,Stack Exchange网络上的问答是为了持久存在并帮助未来的访问者。 - O. R. Mapper
1
更有用的是针对“我正在开发新功能,发现了一个错误并想要提交修复该错误的代码”的情况。即使在这种情况下(甚至可以说是特别适用于这种情况),我经常希望SVN能够让我选择几行代码并忽略文件中的其余部分,而不是让我暂时编辑掉我不想提交的所有更改。 - O. R. Mapper

4

简短版:不行。Subversion是一种全面或无的系统(所有我所知道的源代码控制系统都是如此)

详细版:不行,但是如果您使用类似于NANT的工具进行构建,您可以使用xmlpoke或类似工具在构建时重写文件的某些部分。这对我们很有效 :) 我们在构建部署包时会重写大约6个web.config文件和各种其他应用程序配置文件....


介绍一下……Git!比iPhone早,也是世界上最流行的版本控制系统(有很好的原因)。它会改变你的生活,就像我所知道的所有源代码控制系统一样。 - Sensei James

4
您的问题的解决方案不是让Subversion为您完成,而是配置应用程序,使环境特定的细节(例如[SOME_PATH]值)存储在与检入代码“外部”相同的位置。 无论您是通过标记为SVN忽略的单独文件还是将此信息存储在环境变量中来完成此操作,都取决于您的开发语言/操作系统和其他一些因素。 无论使用哪种解决方案,都可能明智地安排某种默认值,以允许未指定值的情况。 还值得考虑的是详细信息是否应在构建时或运行时应用 - 如果您可以安排后者,则可以更轻松地部署应用程序的新版本。 典型的例子是Web应用程序,其中需要数据库连接,但要使用的实际数据库实例在开发和生产环境之间不同。在这种情况下,数据库配置在Web服务器上定义(而不是在应用程序中,应用程序仅请求具有给定名称的数据库连接的Web服务器),并且开发和生产服务器具有不同的配置。然后,可以将相同的Web应用程序部署到两个服务器上,并使每个应用程序实例访问适当的数据库。

2
你也可以定义:
  • 一个预提交钩子来处理回滚,
  • 和一个后提交钩子来恢复你的文件。
哎呀...实际上这不是一个好主意,根据SVN手册
  • 所有触发器都在服务器端执行(与ClearCase不同,在ClearCase中是在客户端执行)
  • Subversion会保留某些仓库数据的客户端缓存,如果你以这种方式更改提交事务,这些缓存将变得无法检测到过期。这种不一致可能导致出乎意料的行为。而不是修改事务,你应该在预提交钩子中验证事务,并在不满足所需条件时拒绝提交。
一个可能的方法是在一个后提交脚本中修改你的文件,然后将该文件作为独立的更改提交,然后在另一个后提交脚本中恢复它...

TortoiseSVN有客户端钩子。但是这些钩子不被其他客户端支持(比如命令行客户端)。 - Bert Huijben

0
你所寻找的是各种分布式版本控制系统的一个特性,例如darcs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,