Как да се отърва от статуса на непроследени подмодули на Git?

Изглежда не мога да се отърва от непроследено съдържание в подмодулите на Git. Изпълнението на git status дава:

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#    modified:   bundle/snipmate (untracked content)
#    modified:   bundle/surround (untracked content)
#    modified:   bundle/trailing-whitespace (untracked content)
#    modified:   bundle/zencoding (untracked content)
#
no changes added to commit (use "git add" and/or "git commit -a")

Добавянето на параметъра --ignore-submodules скрива тези съобщения; но се чудя дали има начин да се отървете от тази мръсотия по по-подходящ, основен начин.


person Tomer Lichtash    schedule 26.02.2011    source източник
comment
Този отговор: stackoverflow.com/a/5127213/199649 предизвиква повече възможности.   -  person charlax    schedule 14.01.2012


Отговори (11)


Тъй като git status отчита непроследено съдържание, действителният начин да имате чист статус би бил да влезете във всеки един от тези подмодули и:

  • добавяне и предаване на непроследено съдържание,
  • или препратка към непроследеното съдържание в .gitignore, специфично за всеки модул.
  • или можете да добавите същото игнорирано съдържание към .git/info/exclude на подмодула, както peci1 съобщава в коментарите.
  • или добавете dirty към спецификацията на подмодула, както е споменато в ezraspectre на отговор (гласува се със "за").

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • или добавете глобален .gitignore файл (често ~/.gitignore-global). Като например .DS_Store или в моя случай Carthage/Build, както е съобщено от Marián Černý в коментарите. Вижте .gitginore страница с ръководство:

Моделите, които потребителят иска Git да игнорира във всички ситуации (напр. резервни копия или временни файлове, генерирани от редактора по избор на потребителя), обикновено отиват във файл, посочен от core.excludesFile в ~/.gitconfig на потребителя. Стойността му по подразбиране е $XDG_CONFIG_HOME/git/ignore. Ако $XDG_CONFIG_HOME или не е зададено, или е празно, вместо него се използва $HOME/.config/git/ignore.

person VonC    schedule 26.02.2011
comment
+1, почти бях готов да крещя, докато не открия това... тогава осъзнах, че файл .DS_Store е бил автоматично създаден (от OS X) в един от моите подмодули, което ми попречи да ангажирам основния проект. Arg! Време е да актуализирате .gitignore... - person Courtney Christensen; 09.09.2011
comment
Използвайки Xcode, също намерих за полезно да добавя *.xcuserdatad към файла .gitignore-global. Това не позволява на git да се опитва да проследи локалните предпочитания на Xcode. - person Roy Sharon; 10.10.2011
comment
Ако нямате права за натискане на подмодула, тогава не можете да споделяте вашите промени в подмодула с други потребители на родителското репо. Решението на @quincyglenn изглежда работи в такъв случай. - person Drew Noakes; 01.02.2013
comment
@DrewNoakes Съгласен съм. Просто предпочитам да се занимавам с мръсни промени (като ги добавя към .gitignore или към контрол на източника), но не и като ги скривам с опция за локална конфигурация. - person VonC; 01.02.2013
comment
@VonC, всеки отговор има смисъл в зависимост от ситуацията и предпочитанията. Исках да подчертая разграничението тук като препратка към други. Между другото, благодаря за многото ви отговори относно Git тук в SO -- помагахте ми много пъти. - person Drew Noakes; 01.02.2013
comment
Можете дори да се справите без едновременно ангажиране и създаване на .gitignore (което само по себе си става непроследено). Отворете .git/info/exclude на подмодула и добавете редовете за игнориране там (работи като .gitignore, но не е част от споделеното хранилище). - person Martin Pecka; 16.12.2014
comment
@peci1 добра точка. Включих вашия коментар в отговора за по-голяма видимост. - person VonC; 16.12.2014
comment
Понякога можете също да добавите това непроследено съдържание в глобален gitignore файл (често ~/.gitignore-global). Като например .DS_Store или в моя случай Carthage/Build. - person Marián Černý; 18.01.2018

Намерих тази публикация в блог да работят като цяло. Чрез добавяне на опцията ignore = dirty към всеки един от записите във файла .gitmodules.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty
person ezraspectre    schedule 08.09.2012
comment
Предпочитаното от мен решение, тъй като е лесно автоматизирано. - person lethal-guitar; 26.11.2013
comment
Струва си да се спомене, че ignore = untracked също съществува и показва модифицирани проследени файлове, но не и непроследени файлове. Би било хубаво, ако имаше глобална настройка за това за всички подмодули... - person naught101; 27.11.2015
comment
Не е изненадващо, че след почти десетилетие връзката към публикацията в блога е мъртва. :) - person Jesse Adelman; 08.02.2021

Можете също така да отидете до директорията на всеки подмодул и да действате като отделен git. Например:

cd my/project/submodule
git status

... /получава списъка с променени файлове/

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

можете също да актуализирате вашето отдалечено репо на подмодул с

git submodule update

след всичко

person Ricardo Martins    schedule 04.06.2012
comment
Вероятно не искате да правите git add . без да прегледате модифицираните файлове. През повечето време направените промени са добавените .DS_Store файлове - това вероятно трябва да бъде уловено от вашия .gitignore, както Зуртни спомена в първия коментар към отговора. - person gregoltsov; 25.06.2012
comment
В случай, че всъщност не искате да актуализирате подмодулите и искате да се върнете към първоначалното състояние, може да искате да стартирате git submodule update --force. - person Tom; 24.08.2016

Това се получи добре за мен:

git update-index --skip-worktree <path>

Ако не работи с pathname, опитайте името на файла. Уведомете ме дали това работи и за вас.

person DarkCrazy    schedule 07.09.2018

Може да се дължи на detached HEAD във вашия клон на подмодул. Ако случаят е такъв, отидете в пътя на вашия подмодул (напр.: ./bundle/snipmate), след което изпълнетеgit checkout master.

person Browny Lin    schedule 03.11.2013

Заседнах по този въпрос вчера в проект, който имаше близо 12 подмодула.

git status показваше резултат.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

За да разреша грешката с непроследеното съдържание, трябваше да премахна непроследените файлове от всички подмодули (всички бяха *.pyc, *.pyo файлове, генерирани от python), използвайки .gitignore.

За да разреша другия, трябваше да стартирам git submodule update, който актуализира всеки от подмодулите.

person Anshul Goyal    schedule 11.02.2015

В моята ситуация клонирам модули като отправна точка за нов модул в моята ZF2 среда. Това, което прави, е да постави собствена папка .git в директорията.

Решението в този случай е да изтриете папката .git (вероятно ще трябва да покажете скритите файлове, за да я видите).

person HappyCoder    schedule 05.08.2015

Това вероятно се случва, когато имате друга .git [скрита папка] в конкретната папка.

променено: ./../.. (променено съдържание, непроследено съдържание)

уверете се, че вашата поддиректория не съдържа тази папка .git.

Ако случаят е такъв, проблемът може да бъде разрешен чрез ръчно изтриване на папката .git от поддиректорията.

person Subrat Kumar Palhar    schedule 01.02.2019

Предпочитам да използвам SourceTree, така че решението за мен беше да отворя репото на подмодула в SourceTree, което ми показва списък на всички непроследени файлове. След това групирах всички, след което използвах „Премахване“.

Успях да направя това, защото знаех, че всички непроследени файлове всъщност не са необходими.

person Glenn Lawrence    schedule 08.05.2019

Ако това е временен проблем, можете да отидете в папката на подмодула и да стартирате git reset HEAD --hard, но ще загубите всичките си промени вътре в подмодула.

person daigo    schedule 09.12.2014

Според моя опит за MacOS това може да се появи, защото са създадени ._ файлове: В такъв случай: опитайте dot_clean .

person Benedikt Wimmer    schedule 03.05.2021