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

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

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

Ответ 1

Вы добавили 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 добавить явно добавить его, то он создаст запись gitlink, которая указывает на фиксацию HEAD-репозитория вместо добавления содержимого каталога. Было бы неплохо, если бы git add отказался создавать такие "полуподмодули".

Нормальные каталоги представлены как древовидные объекты в Git; древовидные объекты дают имена и разрешения для объектов, которые они содержат (обычно другие объекты дерева и blob-каталоги и файлы, соответственно). Субмодули представлены в виде записей "gitlink"; Записи gitlink содержат только имя объекта (хеш) фиксации HEAD подмодуля. "Исходный репозиторий" для фиксации gitlinks указан в файле .gitmodules (и файле .git/config после инициализации подмодуля).

У вас есть запись, указывающая на конкретную фиксацию, без записи исходного репозитория для этой фиксации. Вы можете исправить это, сделав ваш gitlink в надлежащем подмодуле или удалив gitlink и заменив его "нормальным" контентом (простые файлы и каталоги).

Поверните его в правильный подмодуль

Единственный бит, который вам не хватает, чтобы правильно определить 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 ниже пример поддерева, который сохраняет историю субрепозиций 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 [email protected]:me/my_ofc2_fork.git changes_for_pull_request

git В поддереве также есть опция --squash, которая позволяет избежать включения истории исходных репозиториев в вашу историю, но все же позволяет вам вносить изменения в исходное положение.

Ответ 2

У меня была такая же проблема. Причина была в том, что вложенная папка содержала папку ".git". Удаление сделало git счастливым.

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

У меня была такая же проблема с большим проектом со многими подмодулями. На основе ответов Криса Джонсена здесь и VonC здесь Я строю короткий bash script, который выполняет итерацию по всем существующим записям 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"

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

Ответ 8

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

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

% git status          
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (untracked content)

Глядя на diff, я узнал -dirty, добавленный к хэшу: Еще раз прочитав документы, я решил проблему. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Посмотрите раздел "Ловушки с подмодулями"

Причина заключалась в том, что в подмодуле были внесены изменения или нет следа. Сначала мне пришлось попасть в каталог подмодулей, сделать "git добавить" + "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 из подмодуля может быть передан мастер-модулю.

Ответ 9

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

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

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

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

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

find . -name ".git"

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

Ответ 10

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

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