Как деверсировать файл в svn и / или git

Со мной такое случается постоянно. Я случайно создаю версию файла, я не хочу, чтобы у меня была версия (т.е. файлы конфигурации, специфичные для разработчика / машины).

Если я зафиксирую этот файл, я испорчу пути на всех других машинах разработчика - они будут недовольны.

Если я удалю файл из системы управления версиями, он будет удален с машин других разработчиков - они будут недовольны.

Если я решу никогда не фиксировать файл, у меня всегда будет «грязная» проверка - я недоволен.

Есть ли чистый способ «деверсировать» файл из системы контроля версий, что никого не расстроит?

edit: пытаюсь немного уточнить: я уже зафиксировал файл в репозитории, и я хочу удалить его только из управления версиями - я специально не хочу, чтобы он физически удалялся у всех, кто выполняет проверку. Я изначально хотел, чтобы на это не обращали внимания.

Ответ: Если бы я мог принять второй ответ, это было бы это. Он отвечает на мой вопрос относительно git - принятый ответ касается svn.


person Mo.    schedule 26.08.2008    source источник


Ответы (15)


SVN версии 1.5 поддерживает удаление / удаление файла из репозитория без потери локального файла.

взято из http://subversion.tigris.org/svn_1.5_releasenotes.html

Новая опция --keep-local сохраняет путь после удаления ..

Delete (remove) теперь принимает параметр --keep-local для локального сохранения своих целей, поэтому пути не будут удалены, даже если они не были изменены.

person Community    schedule 30.06.2009
comment
затем вы можете использовать svn propedit со свойством svn: ignore, чтобы убедиться, что эти локально сохраненные файлы не появятся при будущих изменениях. - person jorelli; 11.08.2010
comment
Помешает ли это SVN удалить и локальную копию всех остальных? - person ᆼᆺᆼ; 19.03.2012
comment
Ответ: нет! Черт! - person ᆼᆺᆼ; 19.03.2012
comment
В TortoiseSVN этот параметр скрыт в расширенном контекстном меню: щелкните файл правой кнопкой мыши, удерживая нажатой клавишу Shift. - person Jeroen; 11.09.2012
comment
по моему опыту, при этом файл не будет храниться на машинах других разработчиков. - person Ashkan Kh. Nazary; 12.04.2013
comment
если вы не версируете свой файл свойств svn? - person Emmanuel BRUNET; 13.02.2016
comment
Что вы ожидаете? Если вы прикажете SVN удалить файл из рабочей копии, вы больше не хотите, чтобы он был в рабочей копии. Это означает: его не будет, если кто-то выполнит новую проверку (или синхронизирует существующую рабочую копию). Это фундаментальная концепция системы контроля версий: либо файл является официальным, либо он есть во всех рабочих копиях. Если он должен быть исключен, он автоматически не является официальным = только локальным = не в рабочих копиях. Мой совет: переместите файл в другую папку под контролем версий, если вы все еще хотите сохранить его в своем проекте. - person Regis May; 17.08.2017

В Git, чтобы удалить его из дерева, но НЕ из рабочего каталога, что я думаю, это то, что вам нужно, вы можете использовать флаг --cached, то есть:

git rm --cached <filename>
person wxs    schedule 04.06.2010
comment
Удалит ли это все копии файла, когда они извлекут изменения? - person cHao; 18.09.2012
comment
Я застрял в RabbitVCS, и ваша команда работает для меня как прелесть. Спасибо! @wxs - person Nam G VU; 25.07.2016
comment
@ BenLessani-Sonassi - что, если у них есть локальные изменения? Слияние после сбоя извлечения? - person Tomasz Gandor; 13.09.2017
comment
@ BenLessani-Sonassi Но есть ли способ разблокировать его для всех, не удаляя его? - person jeromej; 10.05.2019

Если вы случайно добавили файл в svn и не зафиксировали его, вы можете вернуть этот файл, и он удалит добавление.

person Glenn Slaven    schedule 26.08.2008

Не попробовав ...

В git, если ваши изменения не были перенесены в другой репозиторий, вы должны иметь возможность git rm затронутые файлы, git rebase --interactive, чтобы изменить порядок фиксации удаления, чтобы она происходила сразу после фиксации, в которой вы случайно добавил оскорбительные файлы, а затем скомпилировал эти два коммита.

Конечно, это не поможет, если кто-то другой отозвал ваши изменения.

person Kai    schedule 26.08.2008
comment
Вам нужно будет передать параметр --cached параметру rm так git rm --cached <file>, чтобы он удалялся только из индекса, а не из файловой системы. - person ghickman; 28.01.2011

Похоже, вы уже добавили и передали файл в Subversion (я предполагаю, что вы используете Subversion). Если это так, то есть только два способа удалить этот файл:

  1. Отметьте файл как удаленный и зафиксируйте.
  2. Выполните svnadmin dump, отфильтруйте ревизию, в которой вы случайно зафиксировали файл, и выполните svnadmin load.

Поверьте мне, вы действительно не хотите делать номер 2. Это сделает недействительными все рабочие копии репозитория. Лучше всего сделать номер 1, пометить файл как проигнорированный и извиниться.

person Sir Rippov the Maple    schedule 26.08.2008

Найдите svn: ignore и .gitignore - эти функции позволяют вам иметь дополнительные файлы в вашем оформлении заказа, которые игнорируются вашим RCS (при выполнении операции «статус» и т. Д.).

Для машинно-зависимых конфигурационных файлов хорошим вариантом является регистрация файла с дополнительным расширением «.sample», т. Е. config.xml.sample. Отдельные разработчики делали копию этого файла в config.xml и настраивали ее для своей системы. С помощью svn: ignore или .gitignore вы можете гарантировать, что неверсированный config.xml файл не будет постоянно отображаться как грязный.

В ответ на ваше редактирование: если вы удалите файл из репозитория сейчас, ваши разработчики столкнутся с конфликтом в следующий раз, когда они сделают обновление (при условии, что все они изменили файл для своей системы). Они не потеряют свои локальные изменения, их можно будет откуда-то восстановить. Если они не внесли никаких локальных изменений, их файл конфигурации исчезнет, ​​но они могут просто повторно получить предыдущий из системы управления версиями и использовать его.

person Greg Hewgill    schedule 26.08.2008

Чтобы полностью удалить файл из репозитория git (скажем, вы зафиксировали файл с паролем в нем или случайно зафиксировали временные файлы)

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

Затем, я думаю, вам нужно выполнить фиксацию и нажать -f, если он находится в удаленных ветках (помните, что это может раздражать людей, если вы начнете изменять историю репозитория ... и если они вытащили от вас раньше, у них все еще может быть файл)

person dbr    schedule 30.08.2008

Чтобы удалить файл, уже находящийся в системе контроля версий:

git rm <filename>

а потом

git commit -m ...

Вы должны добавить каждый файл, который хотите игнорировать, в файл .gitignore. Кроме того, я всегда проверяю файл .gitignore в моем репозитории, поэтому, если кто-то проверит код на своей машине, и файл будет сгенерирован снова, он не «увидит» его как «грязный».

Конечно, если вы уже зафиксировали файл, а кто-то другой получил ваши изменения на другой машине, вам придется изменить каждый локальный репозиторий, чтобы изменить историю. По крайней мере, это возможное решение с git. Не думаю, что svn позволит вам это сделать.

Если файл уже находится в главном репозитории (git) или на сервере (svn), я не думаю, что есть лучшее решение, чем просто удалить файл в другом коммите.

person Sergio Acosta    schedule 26.08.2008

Для SVN вы можете вернуть файлы, которые вы еще не зафиксировали. В TortoiseSVN вы просто щелкаете правой кнопкой мыши файл в окне фиксации и выбираете Вернуть ...

В командной строке используйте svn revert [файл]

Не знаю о GIT, так как никогда им не пользовался.

person Magnus Westin    schedule 26.08.2008

Два простых шага в SVN:
1. Добавьте этот каталог в свойство svn: ignore родительского каталога:

svn propedit svn:ignore .  

2. Удалить каталог:

svn rm mydir

3. Зафиксировать

Обратите внимание, что когда другие разработчики выполняют обновление svn, этот каталог не удаляется. Вместо этого SVN просто отменяет версию.

person Manu Manjunath    schedule 21.03.2012

Насколько мне известно, нет простого способа удалить добавленный файл из управления версиями в svn после его фиксации.

Вам нужно будет сохранить файл в другом месте и удалить его из системы контроля версий. Затем скопируйте резервную копию снова.

В конце концов, это система контроля версий ...;)

person FantaMango77    schedule 26.08.2008

Вы можете исключить файлы из Subversion с помощью параметра global-ignore
http://svnbook.red-bean.com/en/1.1/ch07.html#svn-ch-7-sect-1.3.2
ознакомьтесь с документация для деталей

person paan    schedule 26.08.2008

Если я предпочитаю никогда не фиксировать файл, у меня всегда есть «грязная» проверка - я недоволен.

Что касается этого конкретного момента, вы можете захотеть .gitignore файл, как предлагали другие, или использовать схему, подобную описанной в этот ответ.

person Damien Diederen    schedule 31.08.2008

Вы можете отменить версию всех файлов в текущем каталоге с помощью этой команды. Бит sed меняет порядок, чтобы svn мог его обработать:

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

Как уже указывалось в других ответах, один файл не версируется с помощью этого:

svn rm --keep-local yourFileNameXXX
person PerfectGamesOnline.com    schedule 09.03.2016

В Windows, если вам нужно скопировать папку в другое место и удалить ее из git, чтобы вы больше не видели значки, просто удалите папку .git. Папка .git скрыта, поэтому вам нужно перейти в раздел «Организовать / Папка и параметры поиска», «Показать скрытые файлы» в основной папке. Он должен отменить его версию.

person live-love    schedule 06.12.2016