Как "развернуть" файл в SVN и / или Git - PullRequest
67 голосов
/ 26 августа 2008

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

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

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

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

Является ли чистый способ "развернуть" файл из контроля версий, который приведет к тому, что никто не будет несчастлив?

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

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

Ответы [ 15 ]

64 голосов
/ 05 июня 2010

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

git rm --cached <filename>
34 голосов
/ 01 июля 2009

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

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

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

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

7 голосов
/ 26 августа 2008

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

6 голосов
/ 26 августа 2008

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

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

Конечно, это не поможет, если кто-то еще вытащил ваши изменения.

4 голосов
/ 26 августа 2008

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

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

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

3 голосов
/ 30 августа 2008

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

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

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

3 голосов
/ 26 августа 2008

Посмотрите svn: ignore и .gitignore - эти функции позволяют вам иметь дополнительные файлы в вашей проверке, которые игнорируются вашей RCS (при выполнении операции "status" или чего-либо еще).

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

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

2 голосов
/ 26 августа 2008

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

git rm <filename>

, а затем

git commit -m ...

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

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

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

1 голос
/ 21 марта 2012

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

svn propedit svn:ignore .  

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

svn rm mydir

3. Commit

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

1 голос
/ 26 августа 2008

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

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

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

...