Отражает ли git clone / push / pull точное содержимое репо? - PullRequest
9 голосов
/ 29 июля 2011

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

Я бы предположил, что ничего из этого не произойдет, но я не могу найти никакой документации по этому сценарию.

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

The main reason to specify the file:// prefix is if you want a clean copy of the
repository with extraneous references or objects left out.

1 Ответ

5 голосов
/ 29 июля 2011

Git clone не клонирует висящие объекты.

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

Если только ....

Это был общий клон (указанный с флагом --shared или -s) или локальный клон (--local или -l).Из документов:

-l

Когда репозиторий, с которого выполняется клонирование, находится на локальном компьютере, этот флаг обходит обычный транспортный механизм с поддержкой git и клонирует репозиторий, выполнивкопия HEAD и всего, что находится под каталогами объектов и ссылок .Файлы в каталоге .git / objects / жестко связаны, чтобы по возможности сэкономить место.Теперь это значение по умолчанию, если в исходном хранилище задан синтаксис / path / to / repo, так что по сути это опция no-op.Чтобы принудительно копировать вместо жестких ссылок (что может быть желательно, если вы пытаетесь создать резервную копию своего хранилища), но при этом избегать обычного механизма передачи данных, учитывающего git, можно использовать --no-hardlinks.

-s

Когда репозиторий для клонирования находится на локальном компьютере, вместо использования жестких ссылок автоматически настраивает .git / objects / info / alternates для совместного использования объектов с исходным репозиторием.Результирующий репозиторий запускается без какого-либо собственного объекта.

ПРИМЕЧАНИЕ: это возможно опасная операция;не используйте его, если вы не понимаете, что он делает.Если вы клонируете свой репозиторий, используя эту опцию и , затем удаляете ветви (или используете любую другую команду git, которая делает любую существующую фиксацию без ссылок) в исходном репозитории, некоторые объекты могут стать не ссылками (или зависать).Эти объекты могут быть удалены с помощью обычных операций git (таких как git commit), которые автоматически вызывают git gc --auto .

Поэтому, когда вы делаете git clone /path/to/repo, вы копируете объекты (или создание жестких ссылок), и вы получите висячий объект в этом случае.В других случаях (с использованием git-протоколов, ssh, файловых протоколов и т. Д.) Вы никогда не получите висячие объекты в клоне.

Узнайте, как происходит транспортировка - http://progit.org/book/ch9-6.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...