Я только что обнаружил, что у меня есть несколько старых репозиториев Git, которые не были изменены за последнее десятилетие — и они больше не распознаются как репозитории Git.
Один из неизвестных репозиториев содержит файлы:
drwxr-xr-x 13 jleffler staff 416 Nov 20 2021 .git
-rw-r--r-- 1 jleffler staff 25 Nov 22 2015 .git/COMMIT_EDITMSG
-rw-r--r-- 1 jleffler staff 23 Oct 29 2015 .git/HEAD
-rw-r--r-- 1 jleffler staff 41 Nov 21 2015 .git/ORIG_HEAD
-rwxr--r-- 1 jleffler staff 137 Oct 29 2015 .git/config
-rw-r--r-- 1 jleffler staff 73 Oct 29 2015 .git/description
drwxr-xr-x 11 jleffler staff 352 Oct 29 2015 .git/hooks
-rwxr-xr-x 1 jleffler staff 452 Oct 29 2015 .git/hooks/applypatch-msg.sample
-rwxr-xr-x 1 jleffler staff 896 Oct 29 2015 .git/hooks/commit-msg.sample
-rwxr-xr-x 1 jleffler staff 189 Oct 29 2015 .git/hooks/post-update.sample
-rwxr-xr-x 1 jleffler staff 398 Oct 29 2015 .git/hooks/pre-applypatch.sample
-rwxr-xr-x 1 jleffler staff 1642 Oct 29 2015 .git/hooks/pre-commit.sample
-rwxr-xr-x 1 jleffler staff 1356 Oct 29 2015 .git/hooks/pre-push.sample
-rwxr-xr-x 1 jleffler staff 4951 Oct 29 2015 .git/hooks/pre-rebase.sample
-rwxr-xr-x 1 jleffler staff 1239 Oct 29 2015 .git/hooks/prepare-commit-msg.sample
-rwxr-xr-x 1 jleffler staff 3611 Oct 29 2015 .git/hooks/update.sample
-rw-r--r-- 1 jleffler staff 377 Mar 24 2017 .git/index
drwxr-xr-x 4 jleffler staff 128 May 3 2016 .git/info
-rw-r--r-- 1 jleffler staff 240 Oct 29 2015 .git/info/exclude
-rw------- 1 jleffler staff 59 May 3 2016 .git/info/refs
drwxr-xr-x 4 jleffler staff 128 May 3 2016 .git/logs
-rw-r--r-- 1 jleffler staff 0 May 3 2016 .git/logs/HEAD
drwxr-xr-x 3 jleffler staff 96 Oct 29 2015 .git/logs/refs
drwxr-xr-x 3 jleffler staff 96 May 3 2016 .git/logs/refs/heads
-rw-r--r-- 1 jleffler staff 0 May 3 2016 .git/logs/refs/heads/master
drwxr-xr-x 4 jleffler staff 128 May 3 2016 .git/objects
drwxr-xr-x 3 jleffler staff 96 May 3 2016 .git/objects/info
-rw------- 1 jleffler staff 54 May 3 2016 .git/objects/info/packs
drwxr-xr-x 4 jleffler staff 128 May 3 2016 .git/objects/pack
-r--r--r-- 1 jleffler staff 2024 May 3 2016 .git/objects/pack/pack-9f36e2555a3014c30b8ca6b3594b4c20aec9e723.idx
-r--r--r-- 1 jleffler staff 7200 May 3 2016 .git/objects/pack/pack-9f36e2555a3014c30b8ca6b3594b4c20aec9e723.pack
-rw-r--r-- 1 jleffler staff 98 May 3 2016 .git/packed-refs
Содержимое файла .git/config
:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
Запуск git status
дает:
$ git status
fatal: not a git repository (or any of the parent directories): .git
$
Другой каталог, который все еще распознается как репозиторий, содержит файлы:
drwxr-xr-x 15 jleffler staff 480 Jun 2 16:22 .git
-rw-r--r-- 1 jleffler staff 228 Oct 26 2017 .git/COMMIT_EDITMSG
-rw-r--r-- 1 jleffler staff 206 Oct 21 2017 .git/FETCH_HEAD
-rw-r--r-- 1 jleffler staff 23 Jan 18 2017 .git/HEAD
-rw-r--r-- 1 jleffler staff 41 Oct 21 2017 .git/ORIG_HEAD
-rw-r--r-- 1 jleffler staff 307 Jan 18 2017 .git/config
-rw-r--r-- 1 jleffler staff 73 Jan 18 2017 .git/description
drwxr-xr-x 12 jleffler staff 384 Jan 18 2017 .git/hooks
-rwxr-xr-x 1 jleffler staff 478 Jan 18 2017 .git/hooks/applypatch-msg.sample
-rwxr-xr-x 1 jleffler staff 896 Jan 18 2017 .git/hooks/commit-msg.sample
-rwxr-xr-x 1 jleffler staff 189 Jan 18 2017 .git/hooks/post-update.sample
-rwxr-xr-x 1 jleffler staff 424 Jan 18 2017 .git/hooks/pre-applypatch.sample
-rwxr-xr-x 1 jleffler staff 1642 Jan 18 2017 .git/hooks/pre-commit.sample
-rwxr-xr-x 1 jleffler staff 1348 Jan 18 2017 .git/hooks/pre-push.sample
-rwxr-xr-x 1 jleffler staff 4951 Jan 18 2017 .git/hooks/pre-rebase.sample
-rw-r--r-- 1 jleffler staff 544 Jan 18 2017 .git/hooks/pre-receive.sample
-rwxr-xr-x 1 jleffler staff 1239 Jan 18 2017 .git/hooks/prepare-commit-msg.sample
-rwxr-xr-x 1 jleffler staff 3610 Jan 18 2017 .git/hooks/update.sample
-rw-r--r-- 1 jleffler staff 13334 Jun 2 16:09 .git/index
drwxr-xr-x 4 jleffler staff 128 Nov 11 2018 .git/info
-rw-r--r-- 1 jleffler staff 240 Jan 18 2017 .git/info/exclude
-rw-r--r-- 1 jleffler staff 641 Nov 11 2018 .git/info/refs
drwxr-xr-x 4 jleffler staff 128 Nov 11 2018 .git/logs
-rw-r--r-- 1 jleffler staff 0 Nov 11 2018 .git/logs/HEAD
drwxr-xr-x 4 jleffler staff 128 Jan 18 2017 .git/logs/refs
drwxr-xr-x 3 jleffler staff 96 Nov 11 2018 .git/logs/refs/heads
-rw-r--r-- 1 jleffler staff 0 Nov 11 2018 .git/logs/refs/heads/master
drwxr-xr-x 3 jleffler staff 96 Jan 18 2017 .git/logs/refs/remotes
drwxr-xr-x 4 jleffler staff 128 Nov 11 2018 .git/logs/refs/remotes/origin
-rw-r--r-- 1 jleffler staff 0 Nov 11 2018 .git/logs/refs/remotes/origin/HEAD
-rw-r--r-- 1 jleffler staff 0 Nov 11 2018 .git/logs/refs/remotes/origin/master
drwxr-xr-x 4 jleffler staff 128 Nov 11 2018 .git/objects
drwxr-xr-x 3 jleffler staff 96 Nov 11 2018 .git/objects/info
-rw-r--r-- 1 jleffler staff 54 Nov 11 2018 .git/objects/info/packs
drwxr-xr-x 4 jleffler staff 128 Nov 11 2018 .git/objects/pack
-r--r--r-- 1 jleffler staff 8660 Nov 11 2018 .git/objects/pack/pack-d5c4ff545cf0c5c55c767d2d20a5a947fc9e980e.idx
-r--r--r-- 1 jleffler staff 117736 Nov 11 2018 .git/objects/pack/pack-d5c4ff545cf0c5c55c767d2d20a5a947fc9e980e.pack
-rw-r--r-- 1 jleffler staff 621 Nov 11 2018 .git/packed-refs
drwxr-xr-x 3 jleffler staff 96 Nov 20 2021 .git/refs
drwxr-xr-x 3 jleffler staff 96 Jan 18 2017 .git/refs/remotes
drwxr-xr-x 3 jleffler staff 96 Nov 11 2018 .git/refs/remotes/origin
-rw-r--r-- 1 jleffler staff 32 Jan 18 2017 .git/refs/remotes/origin/HEAD
Файл .git/config
содержит:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = [email protected]:jleffler/scc-snapshots
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
И вывод git status
:
$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Я не уверен, в чем заключаются существенные различия.
Не знаю, важно ли это, но сейчас я использую MacBook Pro с чипом Apple M2 Pro и macOS Sonoma 14.5. Когда были созданы репозитории, я использовал компьютеры MacBook Pro с чипами Intel. Сомневаюсь, что это имеет значение, но теперь я использую zsh
в качестве оболочки там, где раньше использовал bash
.
Текущая версия Git — /usr/bin/git
, которая сообщает о версии «git version 2.39.3 (Apple Git-146)».
Я не эксперт, но, на мой взгляд, отсутствие каталога .git/refs
кажется диагностическим. Без heads
и remotes
репо фактически пусто от доступных данных. Возможный дубликат stackoverflow.com/questions/11604526/git-folder-refs-missing
А также смотрите stackoverflow.com/questions/5767593/…. По сути, вы можете сделать достаточное количество записей .git/refs/heads
, чтобы эта штука заработала вручную, довольно легко.
@Ry-: Я обновлю вопрос, когда проведу расследование, но… у меня есть «рабочая» машина и «домашняя» машина. Проблема у меня обнаружилась на домашней машине. Каталоги $HOME/src
(намеренно) очень похожи — и по крайней мере один из каталогов на рабочей машине работает нормально, а каталог на домашнем — нет. Файлы .git/index
разные. Мне нужно завершить межмашинную проверку, но похоже, что у меня действительно есть рабочая резервная копия. У меня также есть доступ к (рабочим) машинам с Linux с рабочей машины — я могу смотреть копирование туда и обратно.
@matt — Спасибо. Я посмотрю на другие вопросы. Я думаю, что отсутствие refs
может быть просто потому, что репозиторий без них никогда не был клонирован на другую машину (поэтому единственное место, где происходило редактирование, - это локальная машина), тогда как рабочий был «клонирован» (см. записи remote
в файле .git/config
).
Попробуйте git init foo
инициализировать локальный репозиторий foo
и рекурсивно скопировать .git/objects/*
из плохого .git
в foo/.git
. Запустите команды git в foo
, чтобы проверить, все ли в порядке.
@matt: Использование git fsck
звучит многообещающе, но когда я пробую это, я получаю ужасное сообщение «фатальное: не репозиторий git (или какой-либо из родительских каталогов): .git». Так что это не часть ответа.
«Я думаю, что отсутствующие ссылки могут быть просто потому, что репо без них никогда не клонировалось на другую машину». Но для этого вам нужно было бы создать хотя бы одну ветку. Где это? Это то, что вы бы нашли в refs/heads, если бы оно существовало.
@matt — У меня такое впечатление, что ты, вероятно, прав — причина проблемы — отсутствие refs
. Я не уверен, как это можно было испортить. Я не припоминаю, чтобы делал что-либо, что могло бы привести к массовому перемещению вещей. К счастью, похоже, что я могу скопировать репозитории с «рабочей» машины на свою «домашнюю» машину. Альтернативой было бы использовать Time Machine и (попытаться) выяснить, когда произошло изменение. Это может оказаться бесполезным занятием, если изменение произойдет до того, как я получу свою новую «домашнюю» машину — и начнется новая последовательность резервного копирования.
Мне кажется, что, возможно, проблемный репозиторий был задуман как пустой репозиторий: раньше он находился на сервере и был просто скопирован на ваш компьютер, а не клонирован. Если да, то вы можете решить всю проблему, просто клонировав его сейчас. (Разницу в структуре между локальным и пустым репозиторием см. stackoverflow.com/a/49627104/341994)
Я предлагаю очень простое решение. Предположим, вы смотрите на пустой репозиторий, из которого удален каталог refs
. Тогда вы можете решить проблему следующим образом:
.git
подкаталог refs
.refs
подкаталог heads
и подкаталог tags
.Эти каталоги будут пусты. Тем не менее, этого должно быть достаточно, чтобы Git увидел это как репозиторий Git; и вы можете легко проверить эту гипотезу.
Если это не сработает, никакого вреда не будет; просто удалите подкаталог heads
еще раз. Если это сработает, создайте в другом месте новую пустую папку cd
и скажите
git clone /path/to/that/.git
В результате получится пригодное для использования рабочее дерево.
Я реализовал этот сценарий на своей машине, и он сработал, исходя из предположения, что проблемный репозиторий (как предполагается здесь) представляет собой пустой репозиторий без каталога refs
. Но у меня нет возможности узнать, верно ли это предположение для вашего репозитория, поэтому это может не сработать для вас.
Я не думаю, что старость — это обязательно проблема. Git (плохо) выводит одно и то же сообщение, когда возникают проблемы с разрешениями, которые мешают ему распознать репозиторий. Это в защищенном каталоге? Попробуйте использовать утилиту архивирования, чтобы заархивировать каталог, отправить его в базовую систему Linux и проверить
git status
там.