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

80

这种情况经常发生在我身上。我不小心将一个我不想版本控制的文件(即开发人员/机器特定的配置文件)提交了版本。

如果我提交这个文件,我会破坏所有其他开发者机器上的路径,他们会感到不满意。

如果我删除文件并将其从版本控制中删除,那么它将从其他开发者的机器中删除,他们会不满意。

如果我选择永远不提交该文件,则始终会保留“脏”检出状态 - 我会感到不满意。

有没有一种干净的方法可以从版本控制中“取消版本化”文件,从而不会让任何人感到不满意?

编辑:尝试澄清一下:我已经将该文件提交到存储库中,我只想将其从版本控制中删除 - 我明确不希望它在每个人做检出时被物理删除。最初我希望它被忽略。

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

15个回答

87
在Git中,如果你想将文件从树中删除,但是不想在工作目录中删除它,那么可以使用--cached标志。具体操作如下: ```git git rm --cached filename ```

--cached选项表示只将文件从Git暂存区中删除,而不会从工作目录中删除。

git rm --cached <filename>

6
当他们拉取变更时,这会删除其他人文件的副本吗? - cHao
我在使用RabbitVCS时遇到了困难,但是你的命令对我来说简直就像魔法一样好用。非常感谢!@wxs - Nam G VU
@BenLessani-Sonassi - 如果他们有本地更改怎么办?拉取后合并失败了吗? - Tomasz Gandor
@BenLessani-Sonassi 但是,有没有一种方法可以为每个人取消版本控制,而不必将其删除? - jeromej

35

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

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

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

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


2
您可以使用 svn propedit 命令和 svn:ignore 属性来确保这些本地存储的文件不会在未来的更改中出现。 - jorelli
2
回答:不,它没有!该死! - ՕլՁՅԿ
15
在TortoiseSVN中,这个选项被隐藏在“扩展上下文菜单”中:按住Shift键右键单击文件。 - Jeroen
除非您对svn属性文件进行版本控制,否则请勿返回翻译的文本。 - Emmanuel BRUNET
你期望什么?如果你命令SVN从工作副本中删除文件,那么你就不希望它再存在于工作副本中了。这意味着:如果有人执行全新的检出(或同步现有的工作副本),该文件将不存在。这是版本控制系统的基本概念:要么文件是“官方”的,那么它在所有工作副本中都存在。如果要排除它,则自动变为“非官方”= 仅本地 = 不在工作副本中。我的建议是:如果你仍然想保留该文件,请将其移动到版本控制下的其他文件夹中。 - Regis May
显示剩余2条评论

9

如果你在svn中意外“添加”了一个文件,而且还没有提交它,那么你可以恢复该文件,这将删除添加操作。


6

尚未尝试...

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

当然,如果其他人已经拉取了您的更改,则无法帮助您。


你需要在rm命令中加入--cached开关,例如git rm --cached <file>,这样才能只从索引中删除文件,而不是从文件系统中删除。 - ghickman

4
听起来您已经将文件添加并提交到Subversion中了(我假设您正在使用Subversion)。如果是这种情况,那么只有两种方法可以删除该文件:
  1. 标记文件为已删除并提交。
  2. 执行svnadmin dump,过滤掉意外提交该文件的版本,并执行svnadmin load
相信我,您真的不想做第二件事。它会使所有的代码库副本都失效。最好的方法是执行第一步,将文件标记为忽略并道歉。

3

查找svn:ignore和.gitignore - 这些功能允许您在检出中拥有额外的文件,而这些文件将被您的RCS忽略(执行“status”操作或其他操作时)。

对于特定于计算机的配置文件,一个好的选择是提交一个带有额外“.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文件始终检入我的代码库中,因此如果有人在他的计算机上检出代码并重新生成了该文件,他不会将其视为“dirty”状态。

当然,如果您已经提交了该文件,而其他人在另一台机器上获取了您的更改,则必须修改每个本地存储库以修改历史记录。至少这是使用git的可能解决方案,我认为SVN不会让您这样做。

如果文件已经位于主代码库(git)或服务器(svn)中,则我认为没有比在另一个提交中删除该文件更好的解决方案。


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

2. 删除目录:

svn rm mydir

3. 提交

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


1

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

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

我不了解GIT,因为我从未使用过它。


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