如何在 svn 和/或 git 中“取消版本化”文件
Posted
技术标签:
【中文标题】如何在 svn 和/或 git 中“取消版本化”文件【英文标题】:How to "unversion" a file in either svn and/or git 【发布时间】:2010-09-06 20:40:52 【问题描述】:这一直发生在我身上。我不小心对文件进行了版本控制,我不想被版本控制(即开发人员/机器特定的配置文件)。
如果我提交这个文件,我会弄乱所有其他开发者机器上的路径——他们会不高兴。
如果我确实从版本控制中删除了该文件,它将从其他开发人员机器中删除 - 他们会不高兴。
如果我选择从不提交文件,我总是有一个“肮脏”的结帐——我很不高兴。
从版本控制中“取消版本化”文件是否是一种干净的方法,不会导致任何人不满意?
编辑:试图澄清一下:我已经将文件提交到存储库,我只想将其从版本控制中删除 - 我特别不希望它从每个进行结帐的人中物理删除。我最初希望它被忽略。
答案:如果我能接受第二个答案,那就是this。它回答了我关于 git 的问题 - 接受的答案是关于 svn。
【问题讨论】:
【参考方案1】:如果您不小心在 svn 中“添加”了一个文件并且您没有提交它,您可以恢复该文件并且它将删除添加。
【讨论】:
【参考方案2】:要删除已经在源代码管理中的文件:
git rm <filename>
然后
git commit -m ...
您应该将要忽略的每个文件添加到 .gitignore 文件中。我还总是将 .gitignore 文件检查到我的存储库中,所以如果有人检查了他机器上的代码,并且文件再次生成,他不会“看到”它是“脏”的。
当然,如果您已经提交了文件并且其他人在另一台机器上获得了您的更改,那么您将不得不更改每个本地存储库以修改历史记录。至少这是一个可能的 git 解决方案。我不认为 svn 会让你这样做。
如果文件已经在主存储库 (git) 或服务器 (svn) 中,我认为没有比在另一个提交中删除文件更好的解决方案。
【讨论】:
【参考方案3】:对于 SVN,您可以还原尚未提交的文件。在 TortoiseSVN 中,您只需右键单击提交窗口中的文件并选择 Revert...
在命令行使用 svn revert [file]
不了解 GIT,因为我从未使用过它。
【讨论】:
【参考方案4】:据我所知,一旦提交,没有简单的方法可以从 svn 中的版本控制中删除添加的文件。
您必须将文件保存在其他位置并从版本控制中删除。而不是再次复制备份。
毕竟这是一个版本控制系统... ;)
【讨论】:
【参考方案5】:查找 svn:ignore 和 .gitignore - 这些功能允许您在结帐时拥有额外的文件,这些文件会被您的 RCS 忽略(在执行“状态”操作或其他操作时)。
对于特定于机器的配置文件,一个不错的选择是签入一个带有额外“.sample”扩展名的文件,即。 config.xml.sample
。个别开发人员会在config.xml
中制作此文件的副本,并针对他们的系统进行调整。使用 svn:ignore 或 .gitignore 可以确保未版本化的 config.xml
文件不会一直显示为脏文件。
响应您的编辑:如果您现在从存储库中删除该文件,那么您的开发人员将在下次进行更新时遇到冲突(假设他们都为他们的系统更改了该文件)。它们不会丢失本地更改,它们可以从某个地方恢复。如果他们碰巧没有进行任何本地更改,那么他们的配置文件将会消失,但他们可以重新从源代码控制中获取前一个并使用它。
【讨论】:
【参考方案6】:您可以使用全局忽略设置从颠覆中排除文件http://svnbook.red-bean.com/en/1.1/ch07.html#svn-ch-7-sect-1.3.2 详情请查看文档
【讨论】:
【参考方案7】:没试过……
在 git 中,如果您的更改尚未传播到另一个存储库,您应该能够git rm
受影响的文件,git rebase --interactive
将删除提交重新排序为就在您不小心添加了有问题的文件的提交之后,然后将这两个提交压缩在一起。
当然,如果其他人取消了您的更改,这将无济于事。
【讨论】:
您需要像git rm --cached <file>
一样将 --cached 开关传递给 rm,这样它只会从索引中删除,而不是从文件系统中删除。【参考方案8】:
听起来您已经将文件添加并提交给 subversion(我假设您正在使用 Subversion)。如果是这种情况,那么只有两种方法可以删除该文件:
-
将文件标记为已删除并提交。
执行
svnadmin dump
,过滤掉您不小心提交文件的版本并执行svnadmin load
。
相信我,你真的不想做第二个。它会使存储库的所有工作副本失效。最好的办法是做第一件事,将文件标记为忽略并道歉。
【讨论】:
【参考方案9】:从 git 存储库中完全删除文件(假设您提交了一个带有密码的文件,或者意外提交了临时文件)
git filter-branch --index-filter 'git update-index --remove filename' HEAD
然后我认为你必须提交,如果它在远程分支中,则推送 -f(请记住,如果你开始更改存储库的历史记录可能会惹恼人们......如果他们以前从你那里拉过,他们仍然可以拥有该文件)
【讨论】:
【参考方案10】:如果我选择从不提交文件,我总是有一个“肮脏”的结帐 - 我很不高兴。
关于这一点,您可能想.gitignore
其他人建议的文件,或使用类似的方案
在this
answer 中描述
我的。
【讨论】:
【参考方案11】:SVN 1.5 版支持从存储库中删除/删除文件而不会丢失本地文件
取自http://subversion.tigris.org/svn_1.5_releasenotes.html
新的 --keep-local 选项在删除后保留路径..
Delete(删除)现在采用 --keep-local 选项在本地保留其目标,因此即使未修改路径也不会被删除。
【讨论】:
您可以使用 svn propedit 和 svn:ignore 属性来确保这些本地存储的文件不会在未来的更改中出现。 这是否会阻止 SVN 也删除其他所有人的本地副本? 答案:不,它没有!该死! 在 TortoiseSVN 中,此选项隐藏在“扩展上下文菜单”中:shift-右键单击文件。 根据我的经验,这不会将文件保存在其他开发人员的机器中。【参考方案12】:在 Git 中,为了从树中删除它,而不是从工作目录中删除,我认为这是你想要的,你可以使用 --cached 标志,即:
git rm --cached <filename>
【讨论】:
当其他人拉取更改时,这会删除文件的副本吗? 我被 RabbitVCS 困住了,你的命令对我来说只是一种魅力。谢谢! @wxs @BenLessani-Sonassi - 如果他们有本地更改怎么办?拉取失败后合并? @BenLessani-Sonassi 但是有没有办法在不被删除的情况下为所有人取消版本?【参考方案13】:SVN 中的两个简单步骤: 1.在父目录的svn:ignore属性中添加这个目录:
svn propedit svn:ignore .
2。删除目录:
svn rm mydir
3。提交
请注意,当其他开发人员进行 svn 更新 时,该目录不会 被删除。 SVN 只是将其取消版本化。
【讨论】:
【参考方案14】:您可以使用此命令取消当前目录中的所有文件的版本。 sed
位颠倒顺序以便 svn 可以处理它:
find . | sed '1!G;h;$!d'| awk 'print "svn rm --keep-local " $1'
正如其他答案中已经说明的那样,单个文件没有版本化:
svn rm --keep-local yourFileNameXXX
【讨论】:
【参考方案15】:在 Windows 中,如果您正在寻找的是将文件夹复制到另一个位置并将其从 git 中删除,这样您就看不到图标了,您只需删除 .git 文件夹。 .git 文件夹是隐藏的,因此您必须转到主文件夹下的组织/文件夹和搜索选项,显示隐藏文件选项。它应该取消版本。
【讨论】:
以上是关于如何在 svn 和/或 git 中“取消版本化”文件的主要内容,如果未能解决你的问题,请参考以下文章