2010-07-26 3 views
184

Сценарий:Git: Как обновить/проверить один файл с удаленного источника?

  1. я внести некоторые изменения в одном файле локально и запустить git add, git commit и git push
  2. Файл помещается в главный репозиторий удаленного происхождения
  3. У меня есть еще один локальный репозиторий, который развернутый через Capistrano с помощью метода «remote_cache» из этого удаленного репозитория
  4. Теперь я не хочу развертывать все приложение, а просто обновлять/проверять этот файл.

Пожалуйста, это как-то возможно с git? Я не смог найти ничего, что могло бы работать, и я не смог бы понять это. С SVN я только что сделал svn up file и вуаля.

Буду рад за любую помощь, спасибо!

+13

Возможно, вы захотите изменить принятый ответ на тот, который действительно отвечает на ваш вопрос. ;) – steps

+4

После более чем 6 лет, я считаю, мы можем с уверенностью предположить, что этого не произойдет @steps ... –

+3

Это должен быть принятый ответ с наименьшим счетом. –

ответ

-63

Git не работает над отдельными файлами. Я не знаю настройки remote_cache, поэтому я не могу прокомментировать это. Тем не менее, в git, вы должны clone весь репозиторий, внести изменения в файл (ы), зафиксировать его (это локальная операция), а затем отменить изменения.

В вашей настройке вы должны иметь возможность просто pull внести изменения из главного репозитория (назовите его M) на ваш развернутый репо (cap). Я не понимаю, почему у вас возникла проблема. Если B существенно отличается, и вы не хотите его испортить, вы можете добавить M как remote в B, а затем cherry-pick конкретные интересующие вас сообщения (то есть обновление к файлу, о котором вы говорите), в B. Будет ли это работать на вас?

+1

Спасибо! Ну, меня не интересует конкретный коммит в целом, я просто хотел бы обновить один файл до его ревизии HEAD (даже если целая фиксация содержит больше, чем только этот единственный файл) в главной ветке с удаленного источника , Я думаю, что я просто неправильно интерпретирую git с идеями svn. Мне придется экспериментировать с ним немного больше. – foresth

+0

Git сохраняет снимки файловой системы (репозитория), а не отдельные истории файлов, поэтому ваша навигация может быть только между этими моментальными снимками. Ср http://progit.org/book/ch1-3.html –

+5

Я нашел ответ @ qzio очень полезным для аналогичной ситуации, которая у меня была; но у него было ноль голосов, почему? Может быть, это плохая практика или что-то еще? – lfborjas

6

Что вы можете сделать, это:

  1. Обновить ваш местный мерзавец репо:

    git fetch

  2. Построить локальную ветку и проверку на нем:

    git branch pouet && git checkout pouet

  3. Нанести фиксации вы хотите в этой ветке:

    git cherry-pick abcdefabcdef

    (abcdefabcdef является sha1 коммита вы хотите применить)

+4

Как второй, второй шаг также можно выполнить в одной команде как 'git checkout -b pouet'. –

+2

'pouet' - лучшее название ветки для этого примера. – Hussard

589

Это можно сделать (в развернутом хранилище)

git fetch 
git checkout origin/master -- path/to/file 

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

В ходе проверки будет обновлено рабочее дерево с определенным файлом из загруженных изменений (origin/master).

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

+4

, а затем что произойдет с кодом? –

+0

Супер удобный, это отлично работало. Мне нужно было получить файл composer.json и запустить обновление, прежде чем обновлять остальную часть сайта в процессе производства. Если бы я вручную разместил файлы composer.json/lock на месте, когда я сделал pull, это противоречило бы утверждению, что файлы уже существуют. Делая это таким образом, git распознал файлы без жалобы. – David

+4

Это тот ответ, который я искал. – javadba

1

Или git stash (если у вас есть изменения) на ветке, на которой вы находитесь, мастер проверки, потяните за последние изменения, возьмите этот файл на рабочий стол (или все приложение). Оформить заявку на филиал, в котором вы были. Git stash применить обратно к состоянию, в котором вы были, а затем исправить изменения вручную или перетащить его, заменив файл.

Этот способ не является sooooo круто, но он def работает, если вы, ребята, не можете понять ничего другого.

13
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip 
+0

Это должен быть принятый ответ! –

+0

Это хорошее решение для клонирования через ssh, но похоже, что это не поддерживается по https: 'git archive --remote = https: //github.com/git/git.git master: git/contrib/completion git-completion.bash | tar -x' Дает мне сообщение об ошибке: 'fatal: операция не поддерживается протоколом.' – Alderath

-1

Я думаю, что я нашел легкий взломать.

Удалить файл, который вы имеете на локальном хранилище (файл, который вы хотите обновляемой от последней фиксации на удаленном сервере)

А затем сделать git pull

Поскольку файл удаляется, то не будет конфликта

+0

Это удаляет все возможные изменения, внесенные в этот файл локально, а также извлекает все остальные файлы, что конкретно не работает OP хотеть сделать. – legrojan

Смежные вопросы