Як позбутися від субмодулів Git untrecked status?


149

Я, здається, не можу позбутися від неперевершеного вмісту в підмодулях Гіта. Ті, що йдуть git statusвиходи:

# Про майстра відділення
# Зміни, які не ставлять для здійснення комісій:
# (використовуйте "git add ...", щоб оновити те, що буде здійснено)
# (використовуйте "git checkout - ...", щоб скасувати зміни в робочому каталозі)
# (ввести або відкинути непереглянутий або модифікований вміст у підмодулях)
#
# модифіковано: пакет / фрагмент (не відстежений вміст)
# модифіковано: пакет / об'єм (нерозміщений вміст)
# модифіковано: пакет / кінцевий пробіл (не відстежений вміст)
# модифіковано: пакет / zencoding (не відстежений вміст)
#
не додано змін до фіксації (використовуйте "git add" та / або "git commit -a")

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


3
Ця відповідь: stackoverflow.com/a/5127213/199649 викликає більше варіантів.
шарлакс

Відповіді:


95

Оскільки статус git повідомляє про нетренований вміст, фактичним способом отримати чистий статус було б перейти до кожного з цих підмодулів та:

  • додайте та виконайте незавершений вміст,
  • або посилатися на неперевірений вміст у .gitignoreконкретному модулі.
  • або ви можете додати той самий проігнорований вміст до підмодулю .git/info/exclude, як повідомляє peci1 у коментарях .
  • або додати брудні специфікації підмодуля, як зазначено в ezraspectre «s відповіді (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • або додати глобальний .gitignore файл (часто ~/.gitignore-global). Як, наприклад, .DS_Storeабо в моєму випадку, Carthage/Buildяк повідомляє Маріан Черні у коментарях . Переглянути .gitginoreсторінку чоловіка :

Шаблони, які користувач хоче, щоб Git ігнорував у будь-яких ситуаціях (наприклад, резервні копії або тимчасові файли, згенеровані редактором за вибором користувача), як правило, переходять у файл, визначений core.excludesFileкористувачем ~/.gitconfig. Його значення за замовчуванням - $XDG_CONFIG_HOME/git/ignore. Якщо $XDG_CONFIG_HOMEабо не встановлено, або порожньо, $HOME/.config/git/ignoreзамість цього використовується.


5
+1, я був готовий кричати, поки не знайшов цього ... потім зрозумів, що .DS_Storeфайл був автоматично створений (OS X) в одному з моїх підмодулів, не даючи мені зробити головний проект. Аргумент! Час для оновлення .gitignore...
Кортні Крістенсен

Використовуючи Xcode, я також вважаю корисним додати * .xcuserdatad до файлу .gitignore-global. Це запобігає спробі git відслідковувати локальні налаштування Xcode.
Рой Шарон

Якщо у вас немає прав на натиск на підмодуль, ви не можете поділитися своїми змінами в підмодулі з іншими користувачами батьківського репо. @ quincyglenn, здається, працює в такому випадку.
Дрю Ноакс

1
@VonC, будь-яка відповідь має сенс залежно від ситуації та переваг. Я хотів виділити тут відмінність як посилання на інших. BTW дякую за багато відповідей щодо Git тут на SO - ви багато разів допомагали мені.
Дрю Ноакс

2
Можна навіть обійтися, не вводячи в порядок і створюючи .gitignore (який сам стає не відстежуваним). Відкрийте підмодуль .git/info/excludeта додайте туди рядки ігнорування (він працює як .gitignore, але не є частиною спільного сховища).
Мартін Печка

144

Я виявив, що ця публікація в блозі працює в цілому. Додавши ignore = dirtyпараметр до кожної з записів у .gitmodulesфайлі.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty

Моє переважне рішення, оскільки воно легко автоматизується.
летальна гітара

24
Варто згадати, що ignore = untrackedтакож існує, і показує модифіковані відслідковані файли, але не відслідковувані файли. Було б добре, якби для цього були всі глобальні налаштування для всіх підмодулів ...
naught101

12

Ви також можете перейти до кожного режиму підмодуля і діяти як окремий 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

після всього


5
Напевно, ви не хочете обійтися git add .без перегляду змінених файлів. Здебільшого зміни, які були внесені, - це додані .DS_Storeфайли - це, мабуть, має бути схоплено вашими .gitignore, як зуртні згадується в першому коментарі до відповіді.
грегольцов

Якщо ви насправді не хотіли оновлювати підмодулі та хочете повернутися до початкового стану, ви можете запустити git submodule update --force.
Том

4

Це може бути пов’язано з відділенням detached HEADвашого підмодуля. Якщо це так, перейдіть у свій шлях до підмодуля (наприклад:) ./bundle/snipmate, а потім запустіть git checkout master.


2

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


1

У своїй ситуації я клоную модулі як вихідну точку для нового модуля в моєму середовищі ZF2. Для цього потрібно вставити власну папку .git у каталог.

У цьому випадку рішення - видалити папку .git (для перегляду, ймовірно, потрібно буде показати приховані файли).


1

Можливо, це відбувається, коли у вас є інша .git [прихована папка] всередині певної папки.

змінено: ./../ .. (змінений вміст, не відстежений вміст)

переконайтеся, що ваш підкаталог не містить цієї .git папки.

Якщо це так, проблему можна вирішити, видаливши папку .git вручну з підкаталогу.


1

Я вважаю за краще використовувати SourceTree , тому рішенням для мене було відкрити репортаж підмодуля в SourceTree, який показує мені список усіх не відстежених файлів. Я потім групу відбирав їх, а потім використовував "Видалити".

Мені вдалося це зробити, тому що я знав, що всі незафіксовані файли насправді не потрібні.


1

Для мене це вийшло просто чудово:

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

Якщо це не працює з pathname, спробуйте ім'я файлу. Дайте мені знати, чи це працювало і для вас.


-1

Якщо це тимчасова проблема, ви можете зайти в папку підмодуля і запустити, git reset HEAD --hardале ви втратите всі свої зміни всередині підмодуля.

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