Як визначити, чи відслідковується файл із 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.