Как отследить неотслеживаемый контент? - PullRequest
152 голосов
/ 12 ноября 2010

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

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

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

Ответы [ 12 ]

234 голосов
/ 12 ноября 2010

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

Заменить его на обычный контент

Следующийstep предполагает, что в вашем суб-репозитории в vendor/plugins/open_flash_chart_2 нет локальной истории, которую вы хотите сохранить (т.е. все, что вас волнует, это текущее рабочее дерево суб-репозитория, а не история).

Если у вас есть локальная история в под-репозитории, о которой вы заботитесь, то вы должны сделать резервную копию каталога .git под-репозитория, прежде чем удалять его во второй команде ниже. (Также рассмотрите gitподдерево нижеприведенный пример, в котором сохраняется история HEAD под-репозитория.

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 поддерево команда - это приятная оболочка для функций слияния поддеревьев.

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

111 голосов
/ 05 мая 2011

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

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

Ссылочный URL https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U

6 голосов
/ 23 августа 2013

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

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

git add vendor/plugins/open_flash_chart_2/ # УВЕДОМЛЕНИЕ О СЛЭШЕ !!!!

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

5 голосов
/ 29 августа 2013

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

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

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

3 голосов
/ 08 апреля 2015

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

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

3 голосов
/ 12 ноября 2010

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

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

1 голос
/ 07 сентября 2018

Для меня все получилось:

git update-index --skip-worktree

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

Пока!

1 голос
/ 13 ноября 2017

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

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

1 голос
/ 08 февраля 2016

Я недавно столкнулся с этой проблемой, работая над контрактным проектом (считается секретным).Система, в которой мне приходилось запускать код, не имела доступа в Интернет, конечно, в целях безопасности, и поэтому установка зависимостей с использованием composer и npm становилась огромной болью.

После долгих размышлений с моим коллегой,мы решили просто скопировать его и скопировать и вставить наши зависимости вместо установки composer или npm install.

Это привело нас к НЕ добавлению в gitignore поставщиков и npm_modules.Это когда я столкнулся с этой проблемой.

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Я немного погуглил и нашел эту полезную тему в SO.Не будучи большим профессионалом в Git и немного опьяненный во время работы над ним, я просто искал все подмодули в папке vendors

find . -name ".git"

Это дало мне 4-5 зависимостей, которые имелимерзко на них.Я удалил все эти папки .git и вуаля, все заработало.Я знаю, что это взлом, и в любом случае не очень вызывающий.О Боги ТАК, пожалуйста, прости меня!В следующий раз я обещаю читать по ссылкам и повиноваться, о могущественный Линус Товалдс.

...