Как отследить неотслеживаемый контент?
Смотрите ниже сплошную линию для моего оригинального вопроса.
У меня есть папка в моем локальном каталоге, которая не отслеживается. Когда я бегу git status
, Я получил:
Changed but not updated:
modified: vendor/plugins/open_flash_chart_2 (modified content, untracked content)
Когда я печатаю git add vendor/plugins/open_flash_chart_2
тогда попробуй git status
опять же, это все еще говорит, что нетронутый. В чем дело?
Вот простое резюме моего последнего получаса:
Обнаружено, что мой репозиторий Github не отслеживает мой
vendor/plugins/open_flash_chart_2
плагин. В частности, нет содержимого, и оно показывает зеленую стрелку на значке папки.Пытался
git submodule init
No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
Пытался
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
vendor/plugins/open_flash_chart_2 already exists in the index
git status
modified: vendor/plugins/open_flash_chart_2 (untracked content)
Охотился за любым файлом с именем
.gitmodules
в моем репозитории / локальном каталоге, но не смог найти.
Что мне нужно сделать, чтобы мои подмодули работали так, чтобы git мог правильно начать отслеживать?
Это может быть не связано (я включаю его на случай, если это поможет), но каждый раз, когда я печатаю git commit -a
а не как обычно git commit -m "my comments"
выдает ошибку:
E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
dated: Thu Nov 11 19:45:05 2010
file name: c:/san/project/.git/COMMIT_EDITMSG
modified: YES
user name: San host name: San-PC
process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
dated: Thu Nov 11 20:56:09 2010
NEWER than swap file!
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Я новичок в Github, и, несмотря на попытки просмотреть документацию, я немного озадачен этими проблемами. Спасибо.
15 ответов
Вы добавили vendor/plugins/open_flash_chart_2
как запись "gitlink", но никогда не определял ее как подмодуль. Фактически вы используете внутреннюю функцию, которую использует подмодуль git (записи gitlink), но вы не используете саму функцию подмодуля.
Вы, вероятно, сделали что-то вроде этого:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
Эта последняя команда является проблемой. Каталог vendor/plugins/open_flash_chart_2
начинается как независимый репозиторий Git. Обычно такие вложенные репозитории игнорируются, но если вы укажете git add явно добавить его, то он создаст запись gitlink, которая указывает на коммит HEAD под-репозитория вместо добавления содержимого каталога. Было бы неплохо, если бы git add отказывался создавать такие "полу-подмодули".
Нормальные каталоги представлены в Git как древовидные объекты; Объекты дерева дают имена и разрешения для объектов, которые они содержат (обычно это другие объекты дерева и BLOB-объектов - каталоги и файлы соответственно). Подмодули представлены в виде записей "gitlink"; Записи gitlink содержат только имя объекта (хеш) фиксации HEAD подмодуля. "Исходный репозиторий" для коммита gitlink указывается в .gitmodules
файл (и .git/config
файл после инициализации субмодуля).
У вас есть запись, которая указывает на конкретный коммит, без записи исходного репозитория для этого коммита. Вы можете исправить это, либо превратив свою ссылку в правильный подмодуль, либо удалив ссылку и заменив ее "обычным" содержимым (обычные файлы и каталоги).
Превратите это в правильный субмодуль
Единственный бит, который вам не хватает, чтобы правильно определить vendor/plugins/open_flash_chart_2
как подмодуль является .gitmodules
файл. Обычно (если вы еще не добавили его как пустую запись gitlink), вы просто используете git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Как вы обнаружили, это не будет работать, если путь уже существует в индексе. Решение состоит в том, чтобы временно удалить запись gitlink из индекса и затем добавить подмодуль:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Это будет использовать ваш существующий суб-репозиторий (т.е. он не будет повторно клонировать исходный репозиторий) и этап a .gitmodules
файл, который выглядит так:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Он также сделает аналогичную запись в вашем главном хранилище .git/config
(без path
установка).
Передайте это, и у вас будет правильный подмодуль. Когда вы клонируете репозиторий (или отправляете на GitHub и клонируете оттуда), вы сможете повторно инициализировать субмодуль через git submodule update --init
,
Замените его простым содержимым
Следующий шаг предполагает, что ваш суб-репозиторий в vendor/plugins/open_flash_chart_2
не имеет локальной истории, которую вы хотите сохранить (т.е. все, что вас волнует, это текущее рабочее дерево суб-репозитория, а не история).
Если у вас есть локальная история в под-репозитории, о которой вы заботитесь, то вам следует сделать резервную копию под-репозитория .git
каталог перед его удалением во второй команде ниже. (Также рассмотрите приведенный ниже пример поддерева git, который сохраняет историю заголовка под-хранилища).
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
На этот раз при добавлении каталога он не является вложенным хранилищем, поэтому файлы будут добавлены в обычном режиме. К сожалению, так как мы удалили .git
В каталоге нет супер-простого способа поддерживать актуальность с исходным хранилищем.
Вы можете рассмотреть возможность использования слияния поддерево. Это позволит вам легко извлекать изменения из исходного хранилища, сохраняя файлы "плоскими" в вашем хранилище (без подмодулей). Сторонняя команда git subtree является хорошей оболочкой для функций слияния поддеревьев.
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
Потом:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request
Git поддерево также имеет --squash
опция, которая позволяет вам не включать историю исходного репозитория в вашу историю, но все же позволяет вам вносить изменения в основной ветке разработки.
У меня просто была такая же проблема. Причина была в том, что была подпапка с папкой ".git". Удаление этого сделало мерзавца счастливым.
- Я удалил каталоги.git из этих новых каталогов (это может создать драму субмодуля. Google, если интересно).
- Затем я запустил каталоги git rm -rf --cached /the/new/
- Затем я заново добавил каталоги с помощью git add. сверху
URL ссылки https://danielmiessler.com/blog/git-modified-untracked/
Чтобы указать, что мне пришлось выкопать из чата Криса Йохансена с OP (ссылка с ответа на ответ):
git add vendor/plugins/open_flash_chart_2
# добавит gitlink, контент не будет отслеживаться
git add vendor/plugins/open_flash_chart_2/
# Обратите внимание на слэш!!!!
Вторая форма добавит его без gitlink, и его содержимое будет отслеживаться..Git dir удобно и автоматически игнорируется. Спасибо Крис!
Я все время использую трюк, предложенный Питером Ладой и называемый "поддельными подмодулями":
http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb
Это очень полезно в нескольких сценариях (но я использую его для хранения всех моих настроек Emacs в репозитории, включая текущий HEAD всех репозиториев git внутри каталогов пакетов elpa / el-get, поэтому я мог легко откатиться назад / переместиться к известному рабочая версия, когда какое-то обновление что-то ломает).
Я решил эту проблему, удалив файл.git из подпапки.
- Сначала удалите файл.git из подпапки
- Затем удалите свою подпапку из git, запустив этот код, git rm -rf --cached your_subfolder_name
- Затем снова добавьте свою папку с помощью git add. команда
Это сработало просто отлично для меня:
git update-index --skip-worktree
Если это не работает с путем, попробуйте имя файла. Дайте мне знать, если это сработало и для вас.
До свидания!
http://progit.org/book/ch6-6.html
Я думаю, что вы должны прочитать это, чтобы узнать немного о субмодуле. Он хорошо написан, и его чтение не займет много времени.
У меня была такая же проблема с большим проектом со многими подмодулями. Основываясь на ответах Chris Johnsen здесь и VonC здесь, я создаю короткий сценарий bash, который перебирает все существующие записи gitlink и добавляет их как надлежащие подмодули.
#!/bin/bash
# Read all submodules in current git
MODULES=`git ls-files --stage | grep 160000`
# Iterate through every submodule path
while read -r MOD; do
# extract submodule path (split line at whitespace and take string with index 3)
ARRIN=(${MOD})
MODPATH=${ARRIN[3]}
# grep module url from .git file in submodule path
MODURL=`grep "url = " $MODPATH/.git/config`
MODURL=${MODURL##*=}
# echo path and url for information
echo $MODPATH
echo $MODURL
# remove existing entry in submodule index
git rm --cached $MODPATH
# add new entry in submodule index
git submodule add $MODURL $MODPATH
done <<< "$MODULES"
Это исправило это для меня, я надеюсь, что это поможет.
Была такая же проблема, но она не была решена в этой дискуссии.
Я также столкнулся с проблемой субмодуля, как описано в открытии темы.
% git status
# On branch master
# Changes not staged for commit:
# modified: bundle/taglist (untracked content)
Глядя на различия, я обнаружил, что к хешу добавлен грязный текст: еще раз чтение документов решило проблему для меня. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Посмотрите раздел "Подводные камни с подмодулями"
Причина заключалась в том, что в подмодуле произошли изменения или отслеживание контента. Сначала мне нужно было попасть в каталог подмодулей, выполнить "git add" + "git commit", чтобы весь контент отслеживался в подмодуле.
Then "git status" on the master stated
% git commit
# On branch master
# Changes not staged for commit:
# modified: bundle/taglist (new commits)
Теперь этот новый HEAD из субмодуля может быть передан в мастер-модуль.
Недавно я столкнулся с этой проблемой, работая над контрактным проектом (считается секретным). Система, в которой мне приходилось запускать код, не имела доступа в Интернет, конечно, в целях безопасности, и поэтому установка зависимостей с использованием composer и npm становилась огромной болью.
После долгих размышлений с моим коллегой, мы решили просто сделать это и скопировать наши зависимости, вместо того, чтобы делать установку композитора или установку npm.
Это привело нас к НЕ добавлять поставщиков и npm_modules в gitignore. Это когда я столкнулся с этой проблемой.
Changed but not updated:
modified: vendor/plugins/open_flash_chart_2 (modified content, untracked content)
Я немного погуглил и нашел эту полезную ветку на SO. Не будучи большим профессионалом в Git и немного опьяненный во время работы над ним, я просто искал все подмодули в папке vendors
find . -name ".git"
Это дало мне 4-5 зависимостей, которые были на них мерзавцами. Я удалил все эти папки.git и вуаля, все заработало. Я знаю, что это взлом, и в любом случае не очень вызывающий. О Боги ТАК, пожалуйста, прости меня! В следующий раз я обещаю читать по ссылкам и повиноваться, о могущественный Линус Товалдс.
На этот вопрос уже был дан ответ, но я решил добавить в список то, что узнал, когда получил эти сообщения.
У меня есть репо playground
который содержит ряд приложений песочницы. Я добавил два новых приложения из учебника в playground
каталог путем клонирования репозитория учебника. Результатом было то, что git-материал новых приложений указывал на репозиторий учебника, а не на мой репозиторий. Решение было удалить .git
каталог из каждого из каталогов этих приложений, mv
каталоги приложений за пределами playground
каталог, а затем mv
их обратно и бежать git add .
, После этого это сработало.
Единственное, что сработало для меня
- Удаление
.git
папка внутри этого подкаталога - затем переместите этот подкаталог из основного каталога
-
git commit -m "cleaning up"
- перемещение этого подкаталога обратно в основной каталог
- опять таки
git add .
-
git commit -m "message"
-
git push
Теперь это работает
В моем случае проблемный модуль нужно было добавить без косой черты.
/
в пути.
Неправильный:
[submodule "/sources/meta-security"]
path = /sources/meta-security
url = git@gitlab.com:yocto/meta-security.git
Верный:
[submodule "sources/meta-security"]
path = sources/meta-security
url = git@gitlab.com:yocto/meta-security.git
После изменения следующая команда решила проблему:
git submodule update --init
Сначала перейдите в каталог: vendor / plugins / open_flash_chart_2 и DELETE
ЗАТЕМ:
git rm --cached vendor/plugins/open_flash_chart_2
git add .
git commit -m "Message"
git push -u origin master
git status
ВЫХОД
На ветке мастер
Ваша ветка обновлена с "origin/master".
нечего коммитить, рабочий каталог чистый