如何放弃SVN结账的本地更改?

时间:2012-02-27 10:47:31

标签: svn

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

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

我使用svn di > ~/os/firstdiff.diff

生成了差异

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

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

8 个答案:

答案 0 :(得分:225)

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

svn revert some_file.php

({3}}或手册页中记录了(与其他所有svn命令一样),甚至是svn help命令。

答案 1 :(得分:172)

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

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

答案 2 :(得分:14)

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

$ svn revert example_directory/example_file.txt

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

$ svn revert -R example_directory/

答案 3 :(得分:7)

简单svn revert对于原始海报来说足够了。但是,一个简单的svn revert在您

的更一般情况下不会这样做
  1. 包含您要共享的编辑内容以及您不想在同一文件中共享编辑
  2. 进行本地更改,您仍然希望保留自己的私人利益
  3. @ ErichBSchulz使用git add -p的建议非常合理,在这种情况下更为普遍适用。答案只是缺少一些细节。假设您当前的目录是要创建可共享补丁的目录,您可以执行以下操作:

    1. 签出从subversion到另一个目录的pristine版本(选择一个不存在的目录名,这里使用子目录TMP/)。

      $ url=$(svn info . | awk '/^URL/ {print $2}')
      $ svn checkout "$url" TMP
      
    2. 使用pristine svn checkout作为基础,初始化git存储库,忽略.svn目录;将svn中的所有内容提交到临时git存储库

      $ cd TMP                                                     
      $ git init && echo ".svn/" > .gitignore
      $ git add -A && git commit
      $ cd ..
      
    3. 将新准备的git存储库元数据复制到原始工作目录;由于不需要pristine subversion checkout目录,你可以摆脱它。您的工作目录现在既是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
      
    6. 要摆脱git元数据,只需执行rm -rf .git/。如果您计划继续使用原始工作目录进行攻击,则可以继续使用git来管理本地更改。在这种情况下,您可能会从学习如何使用git svn的投入中受益。

      注意:如果您熟悉git,这对于即兴表演来说相当简单。否则这看起来可能有点凌乱。您可以通过从这些步骤中编写脚本来实现&#34;交互式提交&#34;来概括该方法。或者&#34;交互式补丁创建&#34;对于可以在不了解git的情况下使用的svn。

答案 4 :(得分:4)

您可以使用

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

发布你的差异时,不要忘记告诉你正在分辨的版本。

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

答案 5 :(得分:3)

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

svn revert --depth=infinity .

答案 6 :(得分:1)

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

答案 7 :(得分:1)

我意识到这是一个旧查询,但是..。这现在可以轻松完成:

svn revert -R --remove-added /path/to/dir && svn cleanup --remove-unversioned /path/to/dir

第一部分递归恢复更改,并删除添加但未提交的文件。

第二部分删除路径中所有未版本化或忽略的项目。

上述信息的最佳来源。我知道是 svn 客户端本身:

❯ svn help revert
revert: Restore pristine working copy state (undo local changes).
usage: revert PATH...

  Revert changes in the working copy at or within PATH, and remove
  conflict markers as well, if any.

  This subcommand does not revert already committed changes.
  For information about undoing already committed changes, search
  the output of 'svn help merge' for 'undo'.

Valid options:
  --targets ARG            : pass contents of file ARG as additional args
  -R [--recursive]         : descend recursively, same as --depth=infinity
  --depth ARG              : limit operation by depth ARG ('empty', 'files',
                             'immediates', or 'infinity')
  -q [--quiet]             : print nothing, or only summary information
  --changelist [--cl] ARG  : operate only on members of changelist ARG
  --remove-added           : reverting an added item will remove it from disk

❯ svn help cleanup
cleanup: Either recover from an interrupted operation that left the working copy locked,
or remove unwanted files.
usage: 1. cleanup [WCPATH...]
       2. cleanup --remove-unversioned [WCPATH...]
          cleanup --remove-ignored [WCPATH...]
       3. cleanup --vacuum-pristines [WCPATH...]

  1. When none of the options --remove-unversioned, --remove-ignored, and
    --vacuum-pristines is specified, remove all write locks (shown as 'L' by
    the 'svn status' command) from the working copy.  Usually, this is only
    necessary if a Subversion client has crashed while using the working copy,
    leaving it in an unusable state.

    WARNING: There is no mechanism that will protect write locks still
             being used by other Subversion clients. Running this command
             without any options while another client is using the working
             copy can corrupt the working copy beyond repair!

  2. If the --remove-unversioned option or the --remove-ignored option
    is given, remove any unversioned or ignored items within WCPATH.
    Note that the 'svn status' command shows unversioned items as '?',
    and ignored items as 'I' if the --no-ignore option is given to it.

  3. If the --vacuum-pristines option is given, remove pristine copies of
    files which are stored inside the .svn directory and which are no longer
    referenced by any file in the working copy.