2013-01-17 2 views
5

Вот сценарий. У меня две машины, «рабочий стол» и «ноутбук».Как сохранить два репозитория git в синхронизации?

На столе я:

mkdir git_test 
cd git_test 
git init 
dd if=/dev/urandom of=test.img bs=1k count=1000 
git add test.img 
git commit -m "Added first image" 

Тогда на ноутбуке я:

git clone [USER]@desktop:/home/[USER]/git_test  
cd git_test 
dd if=/dev/urandom of=test2.img bs=1k count=1000 
git add test2.img 
git commit -m "Added second image" 

Тогда я хочу GIT репозиторий на моем рабочем столе, чтобы выглядеть как мерзавца репо на моем ноутбуке. На ноутбуке, я выполняю следующее: GIT мастер толчок происхождения

Но я получаю:

remote: error: refusing to update checked out branch: refs/heads/master 
remote: error: By default, updating the current branch in a non-bare repository 
remote: error: is denied, because it will make the index and work tree inconsistent 
remote: error: with what you pushed, and will require 'git reset --hard' to match 
remote: error: the work tree to HEAD. 
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to 
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into 
remote: error: its current branch; however, this is not recommended unless you 
remote: error: arranged to update its work tree to match what you pushed in some 
remote: error: other way. 
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set 
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. 

Как сохранить эти две операции РЕПО в синхронизации?

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

Обратите внимание на следующее!

  • Я не хочу, чтобы использовать централизованный репозиторий, как GitHub, по нескольким причинам. Первая - это безопасность. Вторая - простота. В-третьих, из-за обстоятельств я не буду вдаваться здесь, я не могу рассчитывать на подключение к Интернету на каком-то удаленном сервере, у меня есть только две машины, подключенные через LAN. Наконец, я хочу научиться делать то, что я просил здесь, чтобы получить эту конкретную часть знаний.

  • Я также не хочу использовать голый репо, так как у голого репо есть куча трещин в корневом каталоге. Это уродливо и беспорядочно. Вся причина, по которой я перешел в сторону от подрывной деятельности, заключается в том, что git выглядел как более чистое, децентрализованное решение. Кроме того, у меня есть несколько нетехнических людей, которые будут работать в корневом каталоге рабочего стола, они будут сильно запутаны крутизной. Красота git - это (я думал), что все скрывается в папках .git. Edit: По-видимому, я не был достаточно ясен с этой точки зрения. Представьте, что у меня есть папка «Документы» со следующими подпапками: mydata1 и mydata2. Это не надуманный пример, это именно та проблема, с которой я пытаюсь справиться. mydata1 должен содержать «test.img» и этот файл только, но вместо этого теперь есть:

    ветви конфигурации описание ГОЛОВА крючки Информация объекты рефов

Я хотел быть в состоянии просто вставить cd в mydata1 и начать редактирование файлов, но вместо этого я должен попытаться подключиться к ветвям или что-то еще, чтобы просто выполнить работу. И для такой структуры каталогов для каждая подпапка, которая была в «документах», просто неработоспособна. Пожалуйста, пожалуйста, не говорите мне, чтобы я так поступал. Пожалуйста, просто ответьте на вопрос. Благодарю.

Эти два пункта являются целыми причинам. Я размещаю этот вопрос здесь.Пожалуйста, ответьте только, если у вас есть ответ на этот вопрос. :) Благодаря!!

+0

«cruft» Я имею в виду следующее: «описание конфигурации ветвей HEAD hooks info objects refs» Я просто хочу/home/[User]/git_repo содержать только файлы, с которыми я работаю. Также: .git-папки скрыты. –

+0

Вы можете скрыть репо. – nobar

ответ

10

Один из способов сделать это - тянуть, а не нажимать. После того как вы создали свои две машины, на первой машине:

git remote add origin [USER]@laptop:/home/[USER]/git_test 
git pull # Complains about untracked branch while adding the branch you want to track 
git branch --set-upstream master origin/master 
git pull 

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

+0

тянет абсолютно работает для моего рабочего процесса, пока мне не приходится иметь дело с голой репо или централизованным репо. Спасибо за это разъяснение. Я проверю этот рабочий процесс и отчитаюсь. Благодаря! –

+1

Одна возможность для не-толкания, если машины даже слегка физически разделены: создать псевдоним bash для чего-то вроде «alias git_push =» ssh remotemachine 'cd git_test; git pull' "' – cjc343

+0

Это определенно путь. Подумайте, принадлежало ли вам два репозитария и кому-то другому; вы не захотите, чтобы другой человек сбросил свои вещи в ваш репозиторий, и он не хотел бы, чтобы вы ввалили в него. Совсем другая история, чтобы потянуть новую работу, возможно, в другую ветвь, чем заставить ее подтолкнуть. –

2

Возможно, мне не хватает, почему вы не хотите использовать голый репо, и я считаю, что решение pull only должно работать нормально, но я также считаю, что «крутой» все еще можно скрыть так, как вы хотите, когда работаете с голой репо.

На рабочем столе, если вы:

mkdir git_test 
git init --bare git_test 

И потом:

git clone bare_repo_directory new_location 

Вы можете нажать и тянуть нормально к голому репо (на него ссылаются как исток по умолчанию) из клона, и никто не будет иметь дело с дополнительным содержанием, которое он содержит; клоны будут иметь только каталог .git.

Протолкнуть вам нужно запустить:

git push origin master (assuming you're working out of master) 

Для вашего ноутбука:

git clone [USER]@desktop:path_to_bare 

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

1

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

Два быстрых решений:

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

> git checkout <any-hash> 
Note: checking out '<any-hash>'. 

You are in 'detached HEAD' state... 

Другой путь с новым репо, если вы хотите, чтобы нажать на master, просто изменить эту начальную ветвь к чему-то еще не назвал master:

> git symbolic-ref HEAD refs/heads/non-existent 

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

1

У меня недавно возникла проблема, когда мой сервер и рабочий стол вышли из синхронизации. После некоторого поиска в Интернете я не смог найти ответ, который касался моей точной ситуации. Поэтому я позвонил в поддержку Rackspace, и они смогли предоставить мне то, что, по моему мнению, лучший ответ, чем я смог найти в Интернете.

Этот вопрос был самым близким к моей проблеме, поэтому я решил поделиться тем, как я решил проблему здесь, если кто-то столкнется с той же проблемой в будущем.

Вот что пошло не так

Я пытался установить сладкоежка плагин для Magento и следовало наряду с обычными шагами мы все пройти, чтобы установить расширение Magento. Это означает, что нужно собрать кучу файлов и поместить их в мои каталоги приложений, JS и Skin.

В каталоге app/design/adminhtml есть «базовая» папка. Если вы знаете что-нибудь о Magento, тогда вы знаете, что у них есть миллион предупреждений о беспорядочном использовании базовых файлов. Короче - не делайте этого.

Я предполагал, что, поскольку у моего локального репо не было «базового» каталога, я бы хорошо его положил на свою локальную машину. К сожалению, и к моему ужасу, это означало, что когда я сделал свое добавление, он добавил «базовый» каталог с только файлами для Sweet Tooth. Когда я помещаю это на сервер, он уничтожил всю мою базовую директорию и Boom! вниз пошел Magento.

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

мерзавца сброс --hard ГОЛОВЫ @ {1}

Эта команда вы возвращаетесь к предыдущей фиксации и мгновенно все возвращается к норме. Конечно, теперь мой сервер и рабочий стол были не синхронизированы, так как мой сервер был теперь одним фиксатором.

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

Вот как я решил, что

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

Я позвонил в Rackspace, который на данный момент боги в моем сознании и нашел два разных способа решения этой проблемы в зависимости от того, хотите ли вы сделать это со стороны сервера или на стороне рабочего стола.

Как оказалось, вы действительно не можете сделать это со стороны сервера, так как файлы теперь больше не находятся на рабочем столе. В то время как они рекомендовали сделать git commit -a, а затем сделать нажатие с сервера, а затем вытащить с рабочего стола, это просто не сработает, файлы больше не на рабочем столе.

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

Крепления синхронизации Проблемы с рабочим столом

Чтобы получить файлы из кэша я выпустил следующую команду снова, и снова, и снова, пока файлы, которые я удален не были удалены в соответствии с мерзавцем ,

мерзавец гт -r --cached/папка/каталог для каталогов

и

мерзавец погонных --cached/папок/файлов для файлов

сейчас что это было вне кэша, я смог сделать фиксацию и, наконец, позволить git знать, что эти файлы действительно исчезли.

За этим последовал толчок к мастеру. Тогда все, что осталось сделать, это вытащить с сервера и альта, снова в бизнесе!

** Выводы и извлеченные уроки **

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

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

  2. Если вы случайно винт вещи, убедитесь, чтобы удалить файлы с мерзавцем, не удаляйте их из локальной файловой системы

  3. мерзавца отдых --hard ГОЛОВЫ @ {1} может быть вашим лучшим friend иногда

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

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