Як відстежувати неперероблений контент?


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.
Каскабель

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

1
@sscirrus: Ви обов'язково повинні мати перевагу, підмодуль чи ні. Якщо це зовнішня річ, над якою ви не збираєтеся працювати, але над якою вам можуть знадобитися оновлення, це повинен бути підмодуль. Якщо вам не байдуже отримувати оновлення з оригінального репо, і, можливо, захочете зламати джерело самостійно, це не повинен бути підмодулем.
Каскабель

1
Це питання, як видається, стосується лише субмодулів git. Я видалив деякі теги, оскільки це питання не пов'язане безпосередньо з рейками або 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 як деревні об’єкти; Деревооб'єкти дають імена та дозволи до об'єктів, які вони містять (як правило, інші об'єкти дерева та блобу - каталоги та файли відповідно). Підмодулі представлені у вигляді записів "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, який зберігає історію 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 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

gt subtree також має --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
Ми трохи обговорили цю проблему в чаті . ОП зміг видалити .gitdir із підрепозиторію та повторно додати файли «на самому рівні» (перший варіант «Звичайний вміст»).
Кріс Джонсен

1
Це врятувало мою попу так само днями. Я випадково додав щось із каталогів .git в нього до свого git repo, і тоді git kinda-sorta подумав, що у нього є підмодуль, через що мої git svn dcommiss вибухають. Я б схвалив вас 3 рази, якби міг.
davidtbernal

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

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

114

У мене просто була така ж проблема. Причина полягала в тому, що там була підпапка, яка містила папку ".git". Видалення його зробило git щасливим.


Так, це сталося зі мною в AndroidStudio. Git repo вже створено в папці / app, коли я намагався створити git repo на одну папку вгору. Дякую.
ZirconCode

У мене було створено кутовий кліп у багатьох інших папках, і в одній папці була папка .git: / Це справжня проблема, а не підмодуль!
Паскаль

це працює для мене ... Я намагався додавати git багато разів, але нічого не сталося. потім я видаляю .gitпапку
Ninja

1
Але що робити, якщо я все-таки хочу відстежувати свою папку? Що я повинен зробити ?
cyber8200

Майте той самий випадок. Ще хочу відслідковувати цю папку, яка, на жаль, містила також папку .git. Після видалення цієї папки .git вона не відстежується в моїй головній папці .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

Щоб зазначити, що мені довелося виривати з чату Кріса Йохансена з ОП (пов'язане з відповіді на відповідь):

git add vendor/plugins/open_flash_chart_2 # додасть посилання, вміст не залишиться відстеженим

git add vendor/plugins/open_flash_chart_2/ # ПОВІДОМЛЯЙТЕ СЛОШ !!!!

Друга форма додасть його без gitlink, а вміст відстежується. .Git dir зручно та автоматично ігнорується. Дякую, Крис!


5

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

http://debuggable.com/posts/git-fake-submodules:2b563ee4-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

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


1

На це запитання вже відповіли, але я подумав би додати до суміші те, що дізнався, коли отримав ці повідомлення.

У мене є репо, що називається playgroundрядом програм пісочниці. Я додав два нових додатки з підручника до playgroundкаталогу, клонуючи репо-підручник. Як результат, те, що вміст нових програм вказував на репо-уроки, а не на моє репо. Рішення полягало в тому, щоб видалити .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  

ВИХІД

Про майстра відділення
Ваша філія є в курсі "походження / майстра".
нічого не робити, робочий каталог чистий

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.