Зробити git diff --stat показати повний шлях до файлу


104

Зробивши git diff --statкілька файлів вказані повний шлях від заснування сховища , але деякі файли перераховані як:

.../short/path/to/filename.  

Тобто шлях починається ...і показується лише короткий шлях.

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

Відповіді:


108

git diffКоманда приймає додаткові значення --stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(Для сценаріїв ви можете використовувати git diff-treeбезпосередньо, оскільки це більше "сантехнічна" команда, хоча я підозрюю, що ви будете добре в будь-якому випадку. Зауважте, що вам потрібен той самий додатковий текст, --statколи ви користуєтесь git diff-tree. Суттєва різниця між використанням git diff"фарфору" "передній кінець та команда git diff-treeсантехніки - це те, що git diffшукає налаштовані налаштування для параметрів, таких як diff.renamesвирішити, чи потрібно робити перейменування. Перевірити це, плюс передній кінець git diffбуде еквівалентним, git diff-indexякщо ви порівнюєте команду з індексом Наприклад, іншими словами, git diff читає конфігурацію і автоматично викликає правильну сантехніку .)


6
git diff - numstat - це те саме, що diff-tree
cmcginty

1
Зауважте, що для обмеження ширини останньої частини (+++ / ---) ви можете використовувати окремий --stat-graph-width=...перемикач. Слід також зазначити , що установка максимуму --stat-graph-width=і --stat-name-width=мало, ви також повинні встановити --stat-width=досить великий , щоб покрити два.
jakub.g

@ jakub.g: хороший момент. На основі трохи копання у джерелі git, це увійшло з git 1.7.10.
torek

4
Чи є спосіб глобалізувати це? Набирати це кожного разу божевільно.
Руді

@Rudie: на жаль, ні: є змінна конфігурація, diff.statGraphWidthяку можна використовувати для встановлення --stat-graph-widthзначення, але інші за замовчуванням до ширини вашого терміналу. (Отже, альтернативна відповідь: "так, просто зробіть вікно вашого термінала на 1000 колонок шириною" :-))
torek

22

Для обробки сценаріїв може бути краще використовувати одне з наступних:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

Кожен з них стає більш зручним для надійної обробки скриптів у поєднанні з -zопцією, яка використовує NULяк польові термінатори.


Згідно з моїми тестами, ви не отримуєте повний шлях ресурсу за допомогою цих команд. Поки що я бачу лише відносні шляхи для видалених файлів. Я не знаю, чи так це лише для цих файлів.
GCallie

1
Усі outpu повернуть шляхи відносно git rev-parse --show-toplevel. Первісна проблема стосувалася усічених контурів, що є проблемою в дифсталях, особливо для довгих імен файлів або низького значення для --stat-name-width. Команди, наведені вище, не будуть скорочувати шляхи, але показуватимуть "повний" шлях у відповідності до запиту, хоч і досі відносно кореня сховища.
cmbuckley

18

Для користувачів Bash ви можете використовувати $COLUMNSзмінну для автоматичного заповнення доступної ширини терміналу:

git diff --stat=$COLUMNS

Назви довгих шляхів все ще можуть бути усічені; у цьому випадку ви можете зменшити ширину частини +++ / ---, використовуючи --stat-graph-width, наприклад, це обмежує її на 1/5 ширини терміналу:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

Для більш загального рішення ви можете використовувати висновок tput colsдля визначення ширини клеми.


2
Чи є спосіб глобалізації --stat=$COLUMNS,$COLUMNS? Набирати це кожного разу божевільно.
Руді

@Rudie додати export COLUMNSдо свого ~/.bashrc, а у своєму ~/.gitconfigпід [alias], додатиsmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841

@ user151841 Це змінюється лише diff. Я хочу, щоб він працював і для злиття, і для витягування тощо. (Я навіть не можу це зробити вручну.) Я не думаю, що GIT це підтримує.
Rudie

@Rudie Ну, після завершення витягування або злиття ви можете відрізняти попередній і новий хеші.
користувач151841,

2
@ user151841 Звичайно, але злиття вже дає статистичний підсумок. Без параметрів / конфіг. Було б чудово, якби всі 'stat summaries' використовували одну конфігурацію.
Rudie

4

Там є варіант --name-only: git diff --name-only. Ця опція також підтримується іншими командами git, як showі stash.

Шляхи не вкорочуються з можливістю.


0

Я створив наступний псевдонім git:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Він зчитує підрахунок стовпців з tput colsкоманди. Він за замовчуванням відрізняється від master, але за бажанням можна вказати іншу гілку.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

0

Просте рішення, яке я знайшов, це було зробити: (працює тільки на * nix, вибачте, не osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Ця версія працює для обох, але вона не чудово виглядає на OSX.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"

-1

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

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