我想为开源项目提交差异以供审核。
我使用SVN获得了代码(来自Ubuntu终端)。我在几个文件中做了小的编辑。现在,我只想提交一个更改。我所做的其余更改都是用于调试的,不再需要。
我已经使用生成了差异 svn di > ~/os/firstdiff.diff
所以我的问题是,如何放弃本地更改?
有SVN方法吗?如果没有,我将不得不转到每个文件并删除所有编辑。然后,我将生成一个新的差异,然后提交。
我想为开源项目提交差异以供审核。
我使用SVN获得了代码(来自Ubuntu终端)。我在几个文件中做了小的编辑。现在,我只想提交一个更改。我所做的其余更改都是用于调试的,不再需要。
我已经使用生成了差异 svn di > ~/os/firstdiff.diff
所以我的问题是,如何放弃本地更改?
有SVN方法吗?如果没有,我将不得不转到每个文件并删除所有编辑。然后,我将生成一个新的差异,然后提交。
Answers:
您需要使用svn revert命令恢复所有更改:
svn revert foo.c
svn revert --recursive .
svn revert --recursive .
对我有很大帮助。
--recursive
参数会还原所有本地更改,这就是问题所在。
svn revert
对于原始海报而言,简单就足够了。但是,svn revert
在更一般的情况下,简单的做法是行不通的
@ErichBSchulz的使用建议git add -p
非常合理,在这种情况下更普遍适用。答案只是缺少一些细节。假设当前目录是您要制作可共享补丁的目录,则可以执行以下操作:
将原始版本从子版本签出到另一个目录(选择一个不存在的目录名,此处使用subdirectory TMP/
)。
$ url=$(svn info . | awk '/^URL/ {print $2}')
$ svn checkout "$url" TMP
以原始的svn签出为基础,创建一个git仓库,忽略.svn目录;将svn中的所有内容提交到您的临时git存储库
$ cd TMP
$ git init && echo ".svn/" > .gitignore
$ git add -A && git commit
$ cd ..
将新准备的git仓库元数据复制到您的原始工作目录中;由于不需要原始的subversion检出目录,因此可以摆脱它。您的工作目录现在同时是git和subversion仓库:
$ mv TMP/.git .
$ rm -rf TMP/
现在,您可以使用功能强大且方便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
使用提交,准备要共享的补丁。为此,您还可以使用git diff HEAD^..HEAD
或git format-patch
(后者可以用于直接准备要发送的包含补丁程序或多个补丁程序的电子邮件):
$ git show -p HEAD > my-mighty-patch.patch
要摆脱git meta数据,只需执行即可rm -rf .git/
。如果您打算继续使用原始工作目录进行黑客入侵,则可以继续使用git
来管理本地更改。在这种情况下,您可能会受益于学习使用方法的投资git svn
。
注意:如果您熟悉,git
这是即兴的琐事。否则,这看起来可能有点混乱。您可以通过在这些步骤之外编写脚本来实现该方法的一般化,以实现svn的“交互式提交”或“交互式补丁创建”,而无需了解git即可使用它们。
你可以用
svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff
发布差异时,不要忘记告诉您所针对的修订版本。
正如其他人回答的那样,您也可以svn revert
谨慎使用。这取决于您是否要保留本地更改以用于将来的工作...
revert
更改。所以以后我会用你的方式。