git - Знайдіть фіксацію, де доданий файл


208

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

Прочитавши відповіді та власне майстерність, це працює для мене

git log --follow --diff-filter=A --find-renames=40% foo.js

Відповіді:


317

Ось простіший "чистий Git" спосіб зробити це, без трубопроводу:

git log --diff-filter=A -- foo.js

Перевірте документацію. Можна зробити те ж саме для Видалених, Змінених тощо.

https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203

У мене є зручний псевдонім для цього, тому що я його завжди забуваю:

git config --global alias.whatadded 'log --diff-filter=A'

Це робить його таким же простим, як:

git whatadded -- foo.js

Нижній один вкладиш буде рекурсивно здійснювати пошук у підкаталогах файлу $PWDfor foo.jsбез необхідності введення та абсолютного чи відносного шляху до файлу, а також не потрібно, щоб файл знаходився в тому ж каталозі, що і$PWD

git log --diff-filter=A -- **foo.js

27
+1! Однак мій файл був у підпапці, тому працював лише після того, як я додав зірочку спередуgit log --diff-filter=A -- *subfolder/foo.js
Гео

4
Як це працює з файлами, об'єднаними з інших гілок, але їх не обов'язково додавали до гілки, об'єднаної користувачем, який здійснює об'єднання?
g33kz0r

Посилання на документ вище не переходить до інформації прапора. Можливо, це змінилося з моменту публікації. git-scm.com/docs/git-log#Documentation/…
webbower

1
Так, вони змінили структуру якоря в документах. Оновлено, дякую!
stelterd

@geo Я думаю, я отримую те, що ви говорите, але не дуже, але у мене є подібний випадок використання, коли я, як правило, залишаюся в корені проекту каталогу git і видаю команди звідти, і використовуючи один вкладений вкладиш git log --diff-filter=A -- foo.js, не надрукував зробити ID / хеш для STDOUT в моєму терміналі, а мені довелося надати відносний шлях до файлу з кореня git repo, щоб отримати бажані результати
ipatch


1

Наступне може не цікавити вас, але я думаю, що це допоможе вам у майбутньому та є частиною налагодження екосистеми в Git:

Ви можете використовувати, git-blameщоб показати, яка редакція та автор останнього змінили кожен рядок файлу, особливо анотацію до файлу. Відвідайте https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Наприклад,

git blame -L 174,190  xx.py

Чи можете ви пояснити, будь ласка, що робить кожен з операндів? Я усвідомлюю, що ви надали посилання на відповідний rtfm, але трохи роз'яснення зробить вашу публікацію єдиним доступом.
rossmcm

Як говориться в книзі Pro-Git Якщо ви відстежите помилку в коді і хочете дізнатися, коли він був введений і чому, анотація до файлів часто є найкращим інструментом. Він показує, яка фіксація була останньою для зміни кожного рядка будь-якого файлу, тому цей приклад, який я показав, використовує параметр -L для обмеження виводу рядками 174 по 190, і останнє - це лише цільовий файл, який ви хочете перевірити ( xx.py) у цьому випадку файл python @rossmcm
Reidel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.