Як отримати git-статус однієї підпапки?


84

Коли я роблю git status у підпапці мого сховища, це включає також статус батьківських папок.

Чи є спосіб обмежити git-status лише певною папкою?


1
ні, "git status". видає папки для братів і сестер, наприклад, "../sibling"
EoghanM

Не могли б ви дати трохи більше контексту про те, чому ви хочете відфільтрувати зміни в іншому місці вашого дерева? У яких ситуаціях ви хотіли б використовувати цю функцію?
Грег Бекон

1
Якщо з нормальної команди "git status"
виводиться

Відповіді:


103
git status .

покаже стан поточного каталогу та підкаталогів.

Наприклад, дані файлів (чисел) у цьому дереві:

a/1
a/2
b/3
b/4
b/c/5
b/c/6

з підкаталогу "b", git statusпоказує нові файли у цілому дереві:

% git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   ../a/1
#   new file:   ../a/2
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

але git status .просто показує файли в "b" і нижче.

% git status .
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

Тільки цей підкаталог, не нижче

git status .відображає всі файли нижче "b" рекурсивно. Щоб показати лише файли в "b", але не нижче, вам потрібно передати список лише файлів (а не каталогів) git status. Це трохи хитро, залежно від вашої оболонки.

Зш

У zsh ви можете вибрати звичайні файли з "кваліфікатором glob" (.). Наприклад:

% git status *(.)
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Баш

Bash не має глобальних кваліфікаторів, але ви можете використовувати GNU, findщоб вибрати звичайні файли, а потім передати їх, щоб git statusсподобалося:

bash-3.2$ find . -type f -maxdepth 1 -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Це використання , -maxdepthяке є GNU знайти розширення. POSIX find не має -maxdepth, але ви можете зробити це:

bash-3.2$ find . -path '*/*' -prune -type f -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

2
Вибачте, так довго повертався до цієї відповіді - просто і правильно! Цікаво, чи було додано <pathspec> до статусу git після мого запитання?
EoghanM

Що робити, якщо вас цікавить лише поточна папка, де .йдеться про, але не її підпапки. Будь-яка робота для цього? Дякую!
benjaminz

@benjaminz залежить від вашого використання - для таких речей я використовую глобалізацію оболонки для вибору файлів, але не підкаталогів, наприклад (для zsh) git status *(.). Bash не має скороченого способу перегляду лише файлів, але ви можете використовувати розширений, findнаприклад find . -type f -maxdepth 1 -exec git status {} +. Схоже на те, що ви хочете вставити в псевдонім або сценарій, а не постійно друкувати.
Matt Curtis

3

Деякі команди водопроводу беруть каталог як параметр:

git ls-files -t -o -m aDirectory

дасть вам усі файли змінені, але не оновлені (не додані до етапу) або відстежені. І це для каталогу.

Як написано в цій темі , git ls-files не підтримує --addedопцію ' .

більш фундаментальна причина полягає в тому, що ls-filesсантехніка стосується індексу .
Додано не про порівняння між індексом та робочим деревом.
Він знаходиться між комітом HEAD та індексом, і він не належить до сантехніки ls-файлів.

Отже, використовуючи команди, згадані тут :

git diff-index --name-only -B -R -M -C HEAD src

дасть вам як не додані, так і додані файли

git diff-files --name-only -B -R -M -C src

дасть вам лише не додані файли. (під час виявлення перезаписів, перейменувань, копій, ...)

Як зазвичай із командами сантехніки, деякі сценарії в порядку;)


3

Недосконало, але це працює також із каталогу, який вас цікавить:

git status | grep -v ' \.\./'

Це приховає всі каталоги, які потребують посилання вгору у своєму відносному шляху.

Якщо ви хочете , щоб колір впливів інший кінець встановіть color.statusна always:

git config color.status always

2
Мені подобається, як grep завжди пропонує імпровізоване рішення, якщо ви не знаєте більш конкретного. Вітаємо з програмуванням дзвінків.
murftown

Це набагато потужніше!
benjaminz

3

Можна обмежитися git statusпоточним каталогом (без дочірніх папок), вказавши специфікацію шляху за допомогою магічного слова globта *::

git status ':(glob)*'

Це чудово працює! Саме те, що я шукав!
poindexter

1

Коли я спробував git, я не знайшов способу це зробити.

У підсумку я зробив:

x@x:~/x$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b
#       main/a
nothing added to commit but untracked files present (use "git add" to track)

x@x:~/x$ git status | grep main
#       main/a

Це метод, який я використовував ... наступне також отримує заголовки стану: git status | grep "main \ |: \ $" ... на жаль, ви втрачаєте забарвлення.
EoghanM

Натрапив на це запитання, шукаючи загальний збіг глобусів. Це на сьогоднішній день найпростіше і працює для мене, наприклад, git status | grep extде ext є розширенням. Дякую!

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