2016-12-26 17 views
1

Я на макинтош и пытается «GIT толчок» в локальный каталог симулятора репо:мерзавец толчок к удаленному репо, но не кажется, что ничего не выгружается на репо

mkdir ~/gitremote 
cd ~/gitremote 
git init --bare 

Затем в другом каталоге:

git clone /Users/trosky/gitremote 
vi readme (add one line) 
git add . 
git commit -m "1st file" 
git push -u origin master 

Counting objects: 2, done. 
Writing objects: 100% (2/2), 211 bytes | 0 bytes/s, done. 
Total 2 (delta 0), reused 0 (delta 0) 
To /Users/trosky/gitremote/ 
    c0a3498..ff5511b master -> master 
Branch master set up to track remote branch master from origin. 

Все кажется ОК. Но под ~/gitremote:

$ls 
HEAD  config  hooks  objects 
branches description info  refs 

Кажется, файл «readme» не загружен вообще. Я пробовал этот тест несколько раз, всегда такой же вопрос. Что произойдет, когда я смогу успешно выполнить git push, а «удаленное» репо ничего не имеет.

+1

Возможный дубликат [git push новый файл для голого репо не удалось: «ошибка: src refspec master не соответствует никаким». Почему?] (Http://stackoverflow.com/questions/41326402/git-push-new-file-to-a-bare-repo-failed-error-src-refspec-master-does-not-mat) – vlcekmi3

+0

Вы вероятно, не толкает, где вы думаете ... кстати, в чем причина открытого хранилища? –

ответ

4

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

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

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

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

Иными словами, рабочее дерево - это то место, где вы выполняете свою работу.

Если вы делаете свою работу в рабочем дереве и кто-то другой выталкивает фиксацию в ваше хранилище, и что новый коммит используются для замены работы дерева с их совершенного деревом, что происходит со всеми ваш работы? Все будет потеряно! Таким образом, Git обычно отказывается от нажатия на ваш репозиторий, когда ваш репозиторий имеет дерево работы.

Следовательно, Git предоставляет открытый репозиторий. Голый репозиторий - это один без дерева. Без рабочего дерева никто не может работать в нем, поэтому push не потеряет работу. Таким образом, он служит местом, куда вы всегда можете безопасно двигаться. Это все, но это очень важно.

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

Как видно из сносок, существует множество предостережений и корректировок, но это базовая настройка. Голый клон - это просто для подталкивания, а не-голые клоны - это то, где вы делаете свою работу.


На самом деле, это только при нажатии на текущей ветви, и даже тогда это управляемо.

Обычный git checkout также пытается удостовериться, что вы не потеряли свою собственную работу, которую вы не сохранили. Вы можете сказать «заставить» перезаписать свою собственную работу или использовать git reset --hard, чтобы сначала отказаться от своей собственной работы, и здесь есть много сложных случаев, но Git обычно обрабатывает все совершенные данные как постоянные и неизгладимые. Данные рабочих деревьев гораздо меньше.

1

Ваша фиксация была успешно записана в репозитории gitremote. Попробуйте снова клонировать репо, и вы увидите фиксацию «1-го файла».