Почему 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
Запустите из родительского каталога, где была ошибка.
Затем повторите попытку добавления файлов.
См. также:
Ответ 3
Единственный способ, которым я смог обойти эту ошибку, после
нужно было переименовать каталог, а затем добавить его снова.
Ответ 4
У меня тоже есть эта проблема. Вот мой способ исправить это:
- удалите папку .git в папке подмодуля (если вы сделали это раньше, перейдите 2)
- then excute follow command, directory - это папка подмодуля
git rm --cached directory
git add directory
- тогда вы можете загрузить эту папку, как и другие.