Как отследить неотслеживаемый контент?

Смотрите ниже сплошную линию для моего оригинального вопроса.

У меня есть папка в моем локальном каталоге, которая не отслеживается. Когда я бегу 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". Удаление этого сделало мерзавца счастливым.

  1. Я удалил каталоги.git из этих новых каталогов (это может создать драму субмодуля. Google, если интересно).
  2. Затем я запустил каталоги git rm -rf --cached /the/new/
  3. Затем я заново добавил каталоги с помощью 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 из подпапки.

  1. Сначала удалите файл.git из подпапки
  2. Затем удалите свою подпапку из git, запустив этот код, git rm -rf --cached your_subfolder_name
  3. Затем снова добавьте свою папку с помощью 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".
нечего коммитить, рабочий каталог чистый

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