Какое содержимое конвертируется в Git SHA-1
У меня мало сомнений относительно работы / рабочего процесса git:
1. Git SHA-1 формируется на каждом коммите. Мне нужно уточнить, какие файлы используются для создания этого SHA?,
- Файлы, которые имеют изменения в этом коммите (или)
- Все файлы в репозитории
2.У меня машина Windows. Я установил Sourcetree(GitClient) один, а не git. И я создал репозиторий на Github.com(удаленный репозиторий), и благодаря этому я достигаю своего рабочего пространства как процесса управления версиями. Мое рабочее пространство удаленно.
Пожалуйста, исправьте мою мысль, если я ошибаюсь -> "Без установки сервера Git на нашем компьютере мы можем добиться контроля версий кода через удаленный репозиторий. И, если нам нужен локальный репозиторий, нам нужен сервер Git".
Пожалуйста, кто-нибудь, проясните мои сомнения. Спасибо:)
1 ответ
Расчет SHA
SHA является результатом хэшей родительского объекта (-ов), хэша дерева, имени и адреса электронной почты автора, метки времени, текста сообщения о фиксации и файлов, участвующих в фиксации. (И подпись GPG, если таковая имеется.)
Вот почему, если вы измените сообщение о коммите или перебазируете коммит, вы получите новый SHA.
Остальные файлы в хранилище не участвуют напрямую в этом SHA, но SHA родительского (ых) коммита являются частью вычисления, поэтому они косвенно участвуют.
Вы можете увидеть метаданные, используя cat-file
, Возьмите идентификатор фиксации и сделайте это:
$ git cat-file -p 3d911c37dc7cc6d50af9cbc66aa36084158308f5
tree 487660899e53bef8b15d3e1692172f689ed965c5
parent aa3b68973e845b7a900ab164603f154c8a1ba1c5
author Dan Lowe <dan@xxxxxx.com> 1483760015 -0500
committer Dan Lowe <dan@xxxxxx.com> 1483760015 -0500
Update line number settings in vim for 7.4+
Здесь мы видим объект дерева, одного родителя, автора и коммиттера, а также текст сообщения фиксации. Не показаны вложенные объекты файла, но они есть. В некоторых случаях также присутствует второй родитель (например, коммит слияния).
Git клиенты и серверы
Все репозитории git являются полными репозиториями (кроме мелких клонов). Так что если вы создаете новый репозиторий на своем ноутбуке, это полный репозиторий. Вы можете добавлять, удалять, фиксировать, перебазировать, все эти операции полностью локальны. Вся история репозитория на вашем ноутбуке. Это одна из причин, по которой Git так хорошо работает в автономном режиме.
Однако большинству людей этого мало. Им нужно поделиться кодом с другими разработчиками или опубликовать его для общего пользования. Это цель таких сервисов, как Github, Bitbucket и т. Д.
Эти сервисы - просто еще одна копия полного репозитория, и вы синхронизируете его с этим.
Вот что вы можете попробовать. Я буду использовать командную строку git вместо SourceTree.
## Make two repositories
mkdir a && cd a && git init
cd ..
mkdir b && cd b && git init --bare
## Add some content to 'a'
cd ../a
touch a.txt && git add . && git commit -m "New content"
## Set the other repository as your remote
git remote add origin ../b
## Let's push!
git push -u origin master
## Take a look at 'b' now...
cd ../b
git log
... и ваш коммит от a есть. Вы только что сделали git-сервер! Хотя на самом деле это не самый полезный файл, потому что он находится на вашем диске. Но если вы поместите какой-нибудь SSH или https сервер в середину... теперь у вас есть Github, просто без причудливой части веб-интерфейса.