Как перенести старые репозитории git, которые больше не распознаются как репозитории git?

Я только что обнаружил, что у меня есть несколько старых репозиториев 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

Я не уверен, в чем заключаются существенные различия.

  • Можете ли вы определить, в чем проблема?
  • Есть ли способ исправить это без загрузки старой версии Git, ее сборки и запуска?
  • Решит ли это проблему — или мне просто придется перестраивать историю по одной регистрации за раз, копируя между старым репозиторием с использованием старого Git и новым репозиторием, созданным с использованием текущего Git, предоставляемого системой?

Не знаю, важно ли это, но сейчас я использую 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 (плохо) выводит одно и то же сообщение, когда возникают проблемы с разрешениями, которые мешают ему распознать репозиторий. Это в защищенном каталоге? Попробуйте использовать утилиту архивирования, чтобы заархивировать каталог, отправить его в базовую систему Linux и проверить git status там.

Ry- 03.06.2024 02:49

Я не эксперт, но, на мой взгляд, отсутствие каталога .git/refs кажется диагностическим. Без heads и remotes репо фактически пусто от доступных данных. Возможный дубликат stackoverflow.com/questions/11604526/git-folder-refs-missing

matt 03.06.2024 02:53

А также смотрите stackoverflow.com/questions/5767593/…. По сути, вы можете сделать достаточное количество записей .git/refs/heads, чтобы эта штука заработала вручную, довольно легко.

matt 03.06.2024 02:59

@Ry-: Я обновлю вопрос, когда проведу расследование, но… у меня есть «рабочая» машина и «домашняя» машина. Проблема у меня обнаружилась на домашней машине. Каталоги $HOME/src (намеренно) очень похожи — и по крайней мере один из каталогов на рабочей машине работает нормально, а каталог на домашнем — нет. Файлы .git/index разные. Мне нужно завершить межмашинную проверку, но похоже, что у меня действительно есть рабочая резервная копия. У меня также есть доступ к (рабочим) машинам с Linux с рабочей машины — я могу смотреть копирование туда и обратно.

Jonathan Leffler 03.06.2024 03:25

@matt — Спасибо. Я посмотрю на другие вопросы. Я думаю, что отсутствие refs может быть просто потому, что репозиторий без них никогда не был клонирован на другую машину (поэтому единственное место, где происходило редактирование, - это локальная машина), тогда как рабочий был «клонирован» (см. записи remote в файле .git/config).

Jonathan Leffler 03.06.2024 03:27

Попробуйте git init foo инициализировать локальный репозиторий foo и рекурсивно скопировать .git/objects/* из плохого .git в foo/.git. Запустите команды git в foo, чтобы проверить, все ли в порядке.

ElpieKay 03.06.2024 03:40

@matt: Использование git fsck звучит многообещающе, но когда я пробую это, я получаю ужасное сообщение «фатальное: не репозиторий git (или какой-либо из родительских каталогов): .git». Так что это не часть ответа.

Jonathan Leffler 03.06.2024 03:48

«Я думаю, что отсутствующие ссылки могут быть просто потому, что репо без них никогда не клонировалось на другую машину». Но для этого вам нужно было бы создать хотя бы одну ветку. Где это? Это то, что вы бы нашли в refs/heads, если бы оно существовало.

matt 03.06.2024 03:56

@matt — У меня такое впечатление, что ты, вероятно, прав — причина проблемы — отсутствие refs. Я не уверен, как это можно было испортить. Я не припоминаю, чтобы делал что-либо, что могло бы привести к массовому перемещению вещей. К счастью, похоже, что я могу скопировать репозитории с «рабочей» машины на свою «домашнюю» машину. Альтернативой было бы использовать Time Machine и (попытаться) выяснить, когда произошло изменение. Это может оказаться бесполезным занятием, если изменение произойдет до того, как я получу свою новую «домашнюю» машину — и начнется новая последовательность резервного копирования.

Jonathan Leffler 03.06.2024 05:10

Мне кажется, что, возможно, проблемный репозиторий был задуман как пустой репозиторий: раньше он находился на сервере и был просто скопирован на ваш компьютер, а не клонирован. Если да, то вы можете решить всю проблему, просто клонировав его сейчас. (Разницу в структуре между локальным и пустым репозиторием см. stackoverflow.com/a/49627104/341994)

matt 03.06.2024 05:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
10
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предлагаю очень простое решение. Предположим, вы смотрите на пустой репозиторий, из которого удален каталог refs. Тогда вы можете решить проблему следующим образом:

  • Вручную создайте проблемному каталогу .git подкаталог refs.
  • Вручную добавьте этому подкаталогу refs подкаталог heads и подкаталог tags.

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

Если это не сработает, никакого вреда не будет; просто удалите подкаталог heads еще раз. Если это сработает, создайте в другом месте новую пустую папку cd и скажите

git clone /path/to/that/.git

В результате получится пригодное для использования рабочее дерево.

Я реализовал этот сценарий на своей машине, и он сработал, исходя из предположения, что проблемный репозиторий (как предполагается здесь) представляет собой пустой репозиторий без каталога refs. Но у меня нет возможности узнать, верно ли это предположение для вашего репозитория, поэтому это может не сработать для вас.

matt 03.06.2024 16:50

Другие вопросы по теме