Почему git ошибка с 'Assertion failed' на git add.?

Я разблокировал репо, а затем клонировал его на свой Mac в каталог /YATC. У меня был ранее созданный проект Xcode (TwitterTimeline) в другом каталоге, который я скопировал в /YATC directory. Я сделал git add . в каталоге /YATC, и в репо был добавлен только пустой каталог TwitterTimeline. Никаких других файлов не было добавлено. Позже я узнал, что в TwitterTimeline уже есть каталог .git. Я думаю, что Xcode, должно быть, создал это, хотя я не помню, чтобы когда-либо его спрашивали.

В любом случае, я удалил каталог TwitterTimeline/.git. Я вернулся к /YATC и попытался сделать git add . там, и ничего не произошло. Смысл: я сразу же сделал git status, и он сказал, что нечего делать. Затем я спустился в каталог TwitterTimeline и сделал git add . и получил следующее:

Assertion failed: (item->nowildcard_len <= item->len && item->prefix <= item->len), function prefix_pathspec, file pathspec.c, line 308.
Abort trap: 6

Что это?

Ответ 1

Не уверен, что происходит, но я был в той же ситуации

  • Я переместил один git репо внутри другого
  • удалил .git dir, думая, что он станет обычным subdir
  • попытался git add -A .
  • получил странное сообщение об ошибке

Я обошел его, переименовав subdir, выполнив git add из родительского каталога, а затем переименовав subdir обратно в исходное имя. Каким-то образом, похоже, он вернулся в рабочее состояние.

Ответ 2

В основном проблема известна и обычно влияет на подмодули. Это не ошибка Git, но в основном вместо assert вы должны увидеть правильную ошибку, что конкретный pathspec является частью подмодуля.

Следующий Git патч от Stefan Beller исправляет эту проблему:

--- a/pathspec.c
+++ b/pathspec.c
@@ -313,8 +313,23 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
    }

    /* sanity checks, pathspec matchers assume these are sane */
-   assert(item->nowildcard_len <= item->len &&
-          item->prefix         <= item->len);
+   if (item->nowildcard_len > item->len ||
+       item->prefix         > item->len) {
+       /* Historically this always was a submodule issue */
+       for (i = 0; i < active_nr; i++) {
+           struct cache_entry *ce = active_cache[i];
+           int ce_len = ce_namelen(ce);
+           int len = ce_len < item->len ? ce_len : item->len;
+           if (!S_ISGITLINK(ce->ce_mode))
+               continue;
+           if (!memcmp(ce->name, item->match, len))
+               die (_("Pathspec '%s' is in submodule '%.*s'"),
+                   item->original, ce_len, ce->name);
+       }
+       /* The error is a new unknown bug */
+       die ("BUG: item->nowildcard_len > item->len || item->prefix > item->len)");
+   }
+
    return magic;
 }

Одна из причин может заключаться в том, что каталог, в который вы добавляете файлы, по-прежнему регистрируется как подмодуль в индексе, но на самом деле он не является допустимым репозиторием Git (например, отсутствует каталог .git).

Итак, вы должны:

  • инициализируйте и обновите свои подмодули путем:

     git submodule init
     git submodule update
    

    Запустите из родительского каталога, где была ошибка.

    Убедитесь, что все неинициализированные подмодули имеют пустые каталоги, поэтому перемещайте любые временные файлы из них.

  • или если вам не нужен этот подмодуль, удалите его:

    git rm -f --cached subrepo
    

    Запустите из родительского каталога, где была ошибка.

Затем повторите попытку добавления файлов.


См. также:

Ответ 4

У меня тоже есть эта проблема. Вот мой способ исправить это:

  • удалите папку .git в папке подмодуля (если вы сделали это раньше, перейдите 2)
  • then excute follow command, directory - это папка подмодуля git rm --cached directory git add directory
  • тогда вы можете загрузить эту папку, как и другие.