Як визначити, чи відслідковується файл із git (за кодом виходу оболонки)?


357

Чи є спосіб визначити, чи відслідковується файл, виконавши якусь gitкоманду та перевіривши вихідний код?

Іншими словами: чи відслідковує файл git?


Я думаю, що справа в тому, які критерії вирішують файл як відслідкований або не відстежений. Для пошуку має бути якась відслідкована колекція файлів.
— smwikipedia

Відповіді:


443

спробуйте:

git ls-files --error-unmatch <file name>

вийде з 1, якщо файл не відстежується


Принаймні, для моєї старшої (1.6.0) версії git, вам потрібно поставити --error-unmatchпараметр перед назвою файлу, щоб отримати помилку. Якось ця опція застосовується лише до імен файлів, які слідують за нею.
— Алекс Дюпюй

Власне, проблема виглядає в тому, що параметр permuting GNU не ввімкнено, а при появі після імені файлу (або після нього --) --error-unmatchтрактується як просто інше (не в індексі) ім'я файлу і не має ефекту.
— Алекс Дюпюй

29
git ls-files | grep <PATTERN>? приклад:git ls-files | grep Main.h
— gaussblurinc

1
[Наївний спосіб] Зробити невелику зміну у файлі (додати / видалити пробіл). І подивіться, чи файл перелічено, коли вводиться 'git status'. Дурний спосіб, але може заощадити час.
— BraveNinja

Але я додав і виконую це за допомогою команди "git add -A && git commit -m" blah ". Навіть переглядаю цілі файли з командою" git ls-tree --name-only -r sha1 ".
— Dr.jacky

66

Якщо ви не хочете захаращувати консоль повідомленнями про помилки, можете також запустити

git ls-files file_name

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

Це стане в нагоді, якщо ви хочете об'єднати його в сценарій, наприклад PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}

Я думаю, що це file_nameмає бути точна відповідність (повний шлях + назва файлу), але його можна використовувати з підстановкою:git ls-files *foo.rb
— dechimp

16

EDIT

Якщо вам потрібно використовувати git з bash, є --porcelainваріант git status:

- порцеляна

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

Вихід виглядає приблизно так:

> git status --porcelain
 M starthudson.sh
?? bla

Або якщо ви одночасно створюєте лише один файл:

> git status --porcelain bla
?? bla

ОРИГІНАЛЬНИЙ

робити:

git status

Ви побачите звіт із зазначенням, які файли були оновлені, а які - не відстежуються.

Ви можете бачити, bla.shяк відстежується та змінюється, і newblaне відстежується:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")

Вибачте, я повинен був бути зрозумілішим. Статус нормальний, але я краще перевіряю код виходу, ніж аналіз синтаксису.
— Дейл Форестер

git status --porcelainваш друг, якщо вам потрібно проаналізувати вихідний сценарій, подивіться на пов'язаний документ, він покаже деякі інші корисні варіанти
— stefanB

Хіхі, не працює з дуже старим Git: git status --porcelain error: unknown option porcelain 'Версія 1.6.0 :-)
— Laryx Decidua

@ user465139 це правильно ... вам потрібен git 1.7.0 або новіший (опція порцеляни до цього часу не була додана).
— mason81

13

Спробуйте запустити git statusфайл. Він надрукує помилку, якщо її не відслідковує git

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.

Ого. Я, мабуть, запускав його в каталозі, і він діяв так, ніби перевіряв всю репо. Дякую.
— Дейл Лісник

4
Насправді, якщо я запускаю, git status trackedfileя отримую вихідний код 1 (очікується, що 0 буде корисним), але він не дає мені "error:" у висновку. Я б швидше проаналізував вихідний код, ніж виведення рядка
— Дейл Форестер

43
Я вважаю, що помилка не виникає, якщо я запускаю статус git у файлі, який існує в моїй робочій копії git, але який виключається .gitignore. (Тобто ця відповідь не зробить.)
— JellicleCat

Зауважте, що він не працює добре, якщо файл знаходиться у списку ігнорування, тобто у файлі.gitignore
— Робін Хсу

8
Це не працює. Він завжди друкує те саме, навіть якщо файл не існує. $ git status notthere:On branch master nothing to commit, working directory clean
— Хлоя

6

Я не знаю жодної команди git, яка дає "поганий" код виходу, але це здається простим способом зробити це було б використовувати команду git, яка не дає виводу для не відстежуваного файлу, наприклад git-log або git-ls-файли. Таким чином, вам не потрібно робити будь-який аналіз, ви можете запустити його через іншу просту утиліту, наприклад grep, щоб побачити, чи був вихід.

Наприклад,

git-ls-файли test_file.c | греп.

вийде з нульовим кодом, якщо файл відстежується, але код виходу одного, якщо файл не відстежується.


3

Я пропоную для користувача псевдонім на вас .gitconfig.

Ви повинні зробити так:

1) За допомогою команди git:

git config --global alias.check-file <command>

2) Редагування ~/.gitconfigта додавання цього рядка в псевдонімі розділу:

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

Після запуску команди (1) або збереженого файлу (2) на робочій області ви можете протестувати її:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked

2

використання git logдасть інформацію про це. Якщо файл відстежується в git, команда показує деякі результати (журнали). Інакше це порожньо.

Наприклад, якщо файл відстежується git,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <someone@somedomain.com>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

Якщо файл не відслідковується,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#

1

Всього два мої центи:

git ls-files | grep -x relative/path

де relative/pathїх можна легко визначити, натиснувши tabв оболонці автоматичного завершення. Додайте додатковий, | wc -l щоб отримати вихід 1 або 0.


Залежно від шляху (наприклад, якщо він містить крапку), слід додати grepваріант --fixed-strings.
— EndlosSchleife
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.