如何在SVN检出中丢弃本地更改?


197

我想为开源项目提交差异以供审核。

我使用SVN获得了代码(来自Ubuntu终端)。我在几个文件中做了小的编辑。现在,我只想提交一个更改。我所做的其余更改都是用于调试的,不再需要。

我已经使用生成了差异 svn di > ~/os/firstdiff.diff

所以我的问题是,如何放弃本地更改?

有SVN方法吗?如果没有,我将不得不转到每个文件并删除所有编辑。然后,我将生成一个新的差异,然后提交。

Answers:


253

只需使用svn revert命令,例如:

svn revert some_file.php

(与其他所有svn命令一样)在svnbook资源或手册页中甚至在该svn help命令中都有详细记录。


2
除了Vinayak可能想为自己保留本地无趣的更改。
Basile Starynkevitch 2012年

2
@BasileStarynkevitch:我再次阅读问题,而且看起来不要求其他的变化:“”“” :)“休息的我所做的修改,是对基本调试,并不再需要。”
塞德里克朱利安(Julien)2012年

1
是的...但是他可能想让自己更进一步...(他的问题可能会双向理解)。
Basile Starynkevitch 2012年

193

您需要使用svn revert命令恢复所有更改:

  • 将更改还原到文件: svn revert foo.c
  • 还原整个文件目录: svn revert --recursive .

1
引用svn 1.1有点过时了,尽管它是google提供的第一个链接;)
CédricJulien 2012年

显然,文件名中的某些字符会被忽略。例如icon@2x.png。svn revert icon@2x.png。svn说跳过了“图标”。
topwik

1
这是最好的答案。应该检查一下。
rickfoosusa 2014年

12
svn revert --recursive .对我有很大帮助。
保罗·巴尔加斯

这应该是可接受的答案,因为--recursive参数会还原所有本地更改,这就是问题所在。
arueckauer

15

放弃一个特定文件中的本地更改:

$ svn revert example_directory/example_file.txt

要放弃一个特定文件夹中的本地更改:

$ svn revert -R example_directory/

7

svn revert对于原始海报而言,简单就足够了。但是,svn revert在更一般的情况下,简单的做法是行不通的

  1. 同一文件中既有您要共享的编辑内容,又有您不希望共享的编辑内容
  2. 局部变化,你仍然有兴趣在为保持自己的私人利益

@ErichBSchulz的使用建议git add -p非常合理,在这种情况下更普遍适用。答案只是缺少一些细节。假设当前目录是您要制作可共享补丁的目录,则可以执行以下操作:

  1. 将原始版本从子版本签出到另一个目录(选择一个不存在的目录名,此处使用subdirectory TMP/)。

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. 以原始的svn签出为基础,创建一个git仓库,忽略.svn目录;将svn中的所有内容提交到您的临时git存储库

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. 将新准备的git仓库元数据复制到您的原始工作目录中;由于不需要原始的subversion检出目录,因此可以摆脱它。您的工作目录现在同时是git和subversion仓库:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. 现在,您可以使用功能强大且方便git add -p的交互方式来准确地选择要共享的内容,并将其提交到git存储库中。如果需要将文件添加到提交中,请git add <file-to-add>在执行之前进行git commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. 使用提交,准备要共享的补丁。为此,您还可以使用git diff HEAD^..HEADgit format-patch(后者可以用于直接准备要发送的包含补丁程序或多个补丁程序的电子邮件):

    $ git show -p HEAD > my-mighty-patch.patch
    

要摆脱git meta数据,只需执行即可rm -rf .git/。如果您打算继续使用原始工作目录进行黑客入侵,则可以继续使用git来管理本地更改。在这种情况下,您可能会受益于学习使用方法的投资git svn

注意:如果您熟悉,git这是即兴的琐事。否则,这看起来可能有点混乱。您可以通过在这些步骤之外编写脚本来实现该方法的一般化,以实现svn的“交互式提交”或“交互式补丁创建”,而无需了解git即可使用它们。


3
非常感谢匿名-1,没有任何解释。无论如何,我花了一些时间通过澄清这种方法何时有意义来改善答案。
FooF,2015年

2
非常感谢foof的扩展。向我+1!不用担心 艰难的人群。
ErichBSchulz

1
感谢您的赞许,@ ErichBSchulz!慢慢地,尽管有对手,我们正在使世界成为一个更美好的生活场所!!!;-)
FooF 2015年

4

你可以用

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

发布差异时,不要忘记告诉您所针对的修订版本。

正如其他人回答的那样,您也可以svn revert谨慎使用。这取决于您是否要保留本地更改以用于将来的工作...


+1这是解决问题的最佳方法,但是在这种情况下,我真的很想摆脱所有更改。当然,我不想一直revert更改。所以以后我会用你的方式。
Vinayak Garg,2012年

3

转到该存储库的根目录并运行以下命令

svn revert --depth=infinity .

1
svn revert -R .可能会更短
jesjimher

1

您可以在要放置的文件上使用commit命令,并使用svn revert命令丢弃其余的本地更改

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.