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


159

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

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


2
Я запутался в нескольких вещах. Один: почему ты продолжаешь говорить github? все, о чем ты говоришь, звучит локально (кроме зеленой стрелки - я ничего об этом не знаю). Это правильно, или это вопрос о загрузке обновлений в github? Второе: вы действительно сделали что-нибудь, чтобы создать этот плагин как подмодуль? Подмодуль - это git-репозиторий сам по себе. Вы создаете его отдельно, а затем добавляете в суперпроект.
Каскабель

1
Хм, вывод статуса git говорит о том, что там действительно есть субмодуль ... но у вас действительно нет файла .gitmodules? Честно говоря, если у этого плагина есть собственный репозиторий, и вы знаете, какую версию вы хотите, вы можете просто удалить этот каталог из вашего проекта, убедиться, что в .gitmodules нет записи, и пройти через настройку субмодуля: git submodule add, git submodule update --init.
Каскабель

Джефроми - я фактически не упоминал Github более двух раз - в первый раз, потому что зеленая стрелка появляется в верхней части изображения желтой папки в реальном хранилище Github для open_flash_chart_2. Я с радостью отредактирую ответ, чтобы сделать его более понятным.
sscirrus

1
@sscirrus: У вас обязательно должны быть предпочтения, субмодуль или нет. Если это внешняя вещь, над которой вы не собираетесь работать, но с которой вы хотите получать обновления, это должен быть субмодуль. Если вас не интересует получение обновлений из исходного репозитория, и вы, возможно, захотите взломать исходный код самостоятельно, это не должен быть подмодуль.
Каскабель

1
Этот вопрос, похоже, касается исключительно подмодулей git. Я удалил некоторые теги, потому что этот вопрос не имеет прямого отношения к rails или github, он применим ко всем случаям использования git . И этот trackingтег, похоже, используется для тем «отслеживания посетителей сайта», поэтому он также не будет применяться.
edgerunner

Ответы:


239

Вы добавили 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

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


Крис, я только что попробовал, rm -rf vendor/plugins/open_flash_chart_2/.gitи там написано, что rm не распознан. Затем я попытался, git rm -rf vendor/plugins/open_flash_chart_2/.gitи он сказал fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(но я могу добраться до Windows Explorer!).
sscirrus

2
Мы немного обсудили эту проблему в чате . ОП смог удалить каталог под-репозитория .gitи повторно добавить файлы «категорически» (первая опция «Простой контент»).
Крис Джонсен

1
Это спасло мою задницу на днях. Я случайно добавил что-то с каталогом .git в свой репозиторий git, а затем git kinda-sorta подумал, что у него есть субмодуль, что приводило меня в ужас. Я бы проголосовал 3 раза, если бы мог.
Давидтбернал

Хочу отметить, что сторонний плагин subtreeне следует путать с объединением поддеревьев. Это не обертка. Автор так говорит: P
NebulaFox

@NebulaFox: Хотя поддерево git - это не просто обертка вокруг слияний поддеревьев, оно, безусловно, использует те же методы, что и стандартная процедура «слияния поддеревьев» (т. Е. Слияния git readtree --prefix=pathподдеревьев: git mergeс -s subtreeили-Xsubtree=path ). Он имеет хорошие статистов «сверху», тоже: --squashрежим, splitкоманду, и pushи pullпомощников.
Крис Джонсен

114

У меня просто была такая же проблема. Причина была в том, что была подпапка с папкой «.git». Удаление этого сделало мерзавца счастливым.


Да, это случилось со мной в AndroidStudio. Репозиторий git уже был создан в папке / app, пока я пытался создать репозиторий git на одну папку вверх. Спасибо.
ZirconCode

У меня было угловое приложение, созданное в других папках, и в одной папке была папка .git: / Это настоящая проблема, а не субмодуль!
Паскаль

это работает для меня ... Я пытался добавить мерзавец много раз, но ничего не произошло. затем я удаляю .gitпапку
ниндзя

1
Но что, если я все еще хочу отслеживать свою подпапку? Что я должен делать ?
cyber8200

Иметь тот же случай. Все еще хочу отследить ту подпапку, которая, к сожалению, также содержит папку .git. После удаления этой папки .git sufolder она больше не отслеживается в моей основной папке .git .... :(
sqp_125

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

URL ссылки https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U


6

Чтобы указать, что я должен был выкопать из чата Криса Йохансена с OP (ссылка с ответа на ответ):

git add vendor/plugins/open_flash_chart_2 # добавит gitlink, контент не будет отслеживаться

git add vendor/plugins/open_flash_chart_2/ # Обратите внимание на слэш !!!!

Вторая форма будет добавлять его без GitLink, и содержимое отслеживается. .Git dir удобно и автоматически игнорируется. Спасибо Крис!


5

Я все время использую трюк, предложенный Питером Ладой и называемый «поддельными подмодулями»:

http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

Это очень полезно в нескольких сценариях (но я использую его для хранения всей моей конфигурации Emacs в репозитории, включая текущий HEAD всех репозиториев git в каталогах пакетов elpa / el-get, поэтому я мог легко откатиться назад / переместиться к известному рабочая версия, когда какое-то обновление что-то ломает).


3

http://progit.org/book/ch6-6.html

Я думаю, что вы должны прочитать это, чтобы узнать немного о субмодуле. Он хорошо написан, и его чтение не займет много времени.


3

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

Это исправило это для меня, я надеюсь, что это поможет.


2

Это сработало просто отлично для меня:

git update-index --skip-worktree

Если это не работает с путем, попробуйте имя файла. Дайте мне знать, если это сработало и для вас.

До свидания!


1

Была такая же проблема, но она не была решена в этой дискуссии.

Я также столкнулся с проблемой субмодуля, как описано в открытии темы.

% 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 из субмодуля может быть передан в мастер-модуль.


1

Недавно я столкнулся с этой проблемой, работая над контрактным проектом (считается секретным). Система, в которой мне приходилось запускать код, не имела доступа в Интернет, конечно, в целях безопасности, и поэтому установка зависимостей, используя 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 и вуаля, все заработало. Я знаю, что это взлом, и в любом случае не очень вызывающий. О Боги ТАК, пожалуйста, прости меня! В следующий раз я обещаю читать по ссылкам и повиноваться, о могущественный Линус Товалдс.


1

На этот вопрос уже был дан ответ, но я решил добавить к тому, что узнал, когда получил эти сообщения.

У меня есть репо, playgroundкоторый содержит несколько приложений-песочниц. Я добавил два новых приложения из учебника в playgroundкаталог путем клонирования репозитория учебника. Результатом было то, что git-материал новых приложений указывал на репозиторий учебника, а не на мой репозиторий. Решение состояло в том, чтобы удалить .gitкаталог из каждого из каталогов этих приложений, каталоги mvприложений вне playgroundкаталога, а затем mvснова запустить и запустить их git add .. После этого это сработало.


1

Я решил эту проблему, удалив файл .git из моей подпапки.

  1. Сначала удалите .git файл из вашей подпапки
  2. Затем удалите вашу подпапку из git, запустив этот код, git rm -rf --cached your_subfolder_name
  3. Затем снова добавьте вашу папку с помощью git add. команда

0

Сначала перейдите в каталог : 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».
нечего коммитить, рабочий каталог чистый

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.