如何在svn和/或git中“取消版本”文件


69

它一直在我身上发生。我不小心对文件进行了版本控制,但我不想对其进行版本控制(例如,特定于开发人员/机器的配置文件)。

如果提交此文件,我将弄乱所有其他开发人员机器上的路径-他们将不满意。

如果我确实从版本管理中删除了文件,它将从其他开发人员的机器上删除-他们将不满意。

如果我选择从不提交文件,那么我总是有一个“脏”的结帐-我很不高兴。

是一种从版本控制“取消版本”文件的干净方法,这将导致没有人不满意吗?

编辑:尝试澄清一下:我已经将文件提交到存储库,并且只想从版本控制中删除它-我特别不希望从进行结帐的每个人中实际删除它。我最初希望它被忽略。

答:如果我可以接受第二个答案,那就是this。它回答了我关于git的问题-可接受的答案是关于svn。

Answers:


34

SVN 1.5版支持从存储库中删除/删除文件,而不会丢失本地文件

取自http://subversion.tigris.org/svn_1.5_releasenotes.html

新的--keep-local选项在删除后保留路径。

现在,删除(删除)使用--keep-local选项可以将其目标保留在本地,因此即使未修改路径也不会被删除。


2
然后可以将svn propedit与svn:ignore属性一起使用,以确保这些本地存储的文件在以后的更改中不会出现。
jorelli

这是否也阻止了SVN删除其他所有人的本地副本?
2012年

2
答:不,不!该死的!
2012年

15
TortoiseSVN中,此选项隐藏在“扩展上下文菜单”中:右移鼠标右键单击该文件。
耶隆(Jeroen)2012年

以我的经验,这不会将文件保留在其他开发人员的计算机中。
Ashkan Kh。Nazary

73

在Git中,为了从树中删除而不是从工作目录(我认为这是您想要的)中删除它,可以使用--cached标志,即:

git rm --cached <filename>

6
这会否在其他人拉出更改时删除其他人的文件副本?
cHao 2012年

我对RabbitVCS感到困惑,您的命令对我来说只是一种魅力。谢谢!@wxs
Nam G VU

@ BenLessani-Sonassi-如果他们有局部变化怎么办?拉失败后合并?
Tomasz Gandor

@ BenLessani-Sonassi但是,有一种方法可以在不删除的情况下为所有人取消版本控制?
jeromej,

9

如果您不小心在svn中“添加”了文件但尚未提交,则可以还原该文件并删除添加的文件。


6

没有尝试过...

在git中,如果您的更改尚未传播到另一个存储库,则应该能够对git rm受影响的文件git rebase --interactive进行重新排序,以将删除提交重新排序为恰好在您意外添加了有问题的文件之后提交,然后进行压缩这两个一起提交。

当然,如果其他人撤消了您的更改,这将无济于事。


您需要像这样将--cached开关传递给rm,git rm --cached <file>以便仅从索引而不是文件系统中将其删除。
ghickman 2011年

4

听起来您已经添加了文件并将其提交给Subversion(我假设您正在使用Subversion)。如果真是这样,那么只有两种方法来删除该文件:

  1. 将文件标记为已删除并提交。
  2. 执行svnadmin dump,过滤掉不小心提交文件的版本,然后执行svnadmin load

相信我,您真的不想做第二个。它将使存储库的所有工作副本失效。最好执行1号操作,将文件标记为已忽略并表示歉意。


3

查找svn:ignore和.gitignore-这些功能使您可以在结帐时添加一些其他文件,而这些文件会被RCS忽略(执行“状态”操作或其他操作时)。

对于特定于计算机的配置文件,一个不错的选择是检入一个带有额外“ .sample”扩展名的文件,即。config.xml.sample。各个开发人员将在其中复制此文件config.xml并对其进行调整。使用svn:ignore或.gitignore可以确保未版本化的config.xml文件不会一直显示为脏文件。

响应您的编辑:如果现在从存储库中删除文件,则开发人员在下次进行更新时会发生冲突(假设他们都已为系统更改了文件)。他们不会丢失本地更改,可以从某个地方恢复。如果他们碰巧没有进行任何本地更改,则它们的配置文件将消失,但是他们可以从源代码控制中重新获得前一个文件并使用它。


3

要从git存储库中完全删除文件(例如,您提交了其中包含密码的文件,或者不小心提交了临时文件)

git filter-branch --index-filter 'git update-index --remove filename' HEAD

然后,我认为您必须提交,如果它在远程分支中,则推-f(请记住,如果您开始更改存储库的历史记录,可能会使人烦恼..如果他们以前从您那里拉过,他们仍然可以拥有该文件)


2

要删除源控制中已经存在的文件:

git rm <filename>

接着

git commit -m ...

您应该将每个要忽略的文件添加到.gitignore文件中。另外,我总是将.gitignore文件检查到我的存储库中,因此,如果有人在他的计算机上签出代码,并且再次生成该文件,他将不会“将其视为”脏污”。

当然,如果您已经提交了文件并且其他人在另一台计算机上进行了更改,则必须更改每个本地存储库才能修改历史记录。至少这是git的可能解决方案。我认为svn不会让您这样做。

如果文件已经在主存储库(git)或服务器(svn)中,那么我认为没有比在另一个提交中删除文件更好的解决方案了。


1

对于SVN,您可以还原尚未提交的文件。在TortoiseSVN中,只需在提交窗口中右键单击该文件,然后选择“还原...”。

在命令行上使用svn revert [file]

因为我从没使用过,所以不了解GIT。


1

SVN中的两个简单步骤:
1.在父目录的svn:ignore属性中添加此目录:

svn propedit svn:ignore .  

2.删除目录:

svn rm mydir

3.提交

请注意,当其他开发人员执行svn update时,该目录不会被删除。SVN只是取消版本控制。


0

据我所知,一旦提交,没有简单的方法可以从svn的版本控制中删除添加的文件。

您必须将文件保存在其他位置,然后从版本控制中将其删除。然后再复制一次备份。

毕竟这是一个版本控制系统...;)




0

您可以使用此命令取消版本化当前目录中的所有文件。该sed位反转了顺序,因此svn可以对其进行处理:

find . | sed '1!G;h;$!d'| awk '{print "svn rm --keep-local " $1}'

正如其他答案中已经提到的那样,单个文件没有版本:

svn rm --keep-local yourFileNameXXX

0

在Windows中,如果您要查找的是将文件夹复制到另一个位置并将其从git中删除,以致您不再看到图标,则只需删除.git文件夹即可。.git文件夹已隐藏,因此您必须转到主文件夹下的“组织/文件夹和搜索选项,显示隐藏文件”选项。它应该取消版本控制。

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.