Способ уведомить git, когда файл перемещается путем перетаскивания в Finder?

Я использую git для управления своей диссертацией, и у меня есть много журнальных статей в формате pdf, которые я медленно реорганизую с помощью Finder, поскольку моя структура каталогов нормализуется в течение следующих нескольких месяцев. Я хотел бы найти способ сообщить git, что эти файлы просто перемещены, а не удалены и добавлены как новые файлы, чтобы избежать раздувания репо.

Делать это из командной строки неудобно, когда мне нужно переместить 20 из 30 файлов в папку или папки.

У кого-нибудь есть хороший способ сделать это? Или git делает это автоматически, и я просто не могу сказать?

Спасибо!


person patrickkidd    schedule 10.07.2017    source источник
comment
если вы используете слова repo bloat и git одновременно.... ну.... вы делаете это неправильно. Подобные репозитории ПРЕДНАЗНАЧЕНЫ для отслеживания огромного количества изменений и файлов — нет такой вещи, как раздутый, даже такие левиафаны, как Linux, обрабатываются чертовски хорошо. Кроме того: это сообщество посвящено программированию, тогда как ваш вопрос в значительной степени касается именно системного администрирования.   -  person specializt    schedule 10.07.2017
comment
@specializt - Нет такой вещи, как раздутый репо? Неправильно. Весь проект LFS существует из-за ошибочности этого утверждения. Как я заметил в своем ответе, это особое беспокойство по поводу раздувания ошибочно; но, с другой стороны, репозиторий больших двоичных файлов (например, PDF) — это именно тот тип репо, который вполне может страдать от раздувания.   -  person Mark Adelsberger    schedule 10.07.2017
comment
что вообще должно означать страдать? Проблемы с производительностью? Об этом следует сообщать через средство отслеживания ошибок GIT, и уж точно не о переполнении стека — это серьезная ошибка, и ее следует устранить, поскольку репозитории не должны страдать только потому, что кто-то загрузил большое количество двоичных файлов, и если пользователь пытается клонировать всю историю репозитория одним запросом, производительность должна быть... приемлемой, по крайней мере   -  person specializt    schedule 11.07.2017


Ответы (2)


Независимо от того, что вы «скажете» git или как вы это скажете, git всегда будет понимать перемещенный файл как «файл в этом месте удален; файл в этом другом месте создан». Иногда он интерпретирует это как «файл, перемещенный из этого места в это другое место» в своем выводе, но для этого не требуется никаких специальных запросов. Но в принципе в git нет такой вещи, как операция «перемещения».

Вы упоминаете, что вас беспокоит раздувание репо. Не нужно беспокоиться. Даже если git видит два файла с одинаковым содержимым, он сохраняет содержимое только один раз. Содержимое хранится в объекте с именем BLOB. Имя файла хранится в объекте, похожем на «список каталогов», который называется TREE. Поэтому, когда вы перемещаете файл, новая запись в TREE (возможно, в другом объекте TREE, если вы переместили файл в другой каталог) просто указывает на уже существующий BLOB.

Все это автоматически. Вы, конечно, должны добавить/зафиксировать изменения, но оттуда об этом позаботятся.

person Mark Adelsberger    schedule 10.07.2017
comment
Таким образом, он должен использовать контрольную сумму или что-то еще, чтобы увидеть, был ли файл где-то раньше? - person patrickkidd; 10.07.2017
comment
да. По своей сути git — это файловая система с адресацией по содержимому — база данных объектов (таких как объекты BLOB, представляющие содержимое файла), индексированных с помощью контрольной суммы SHA1. В распакованном репозитории вы можете увидеть, как это работает, изучив .git/objects. Объект с контрольной суммой SHA 1234567890abcdeabcde1234567890abcdeabcde1234567890abcdeabcde1234567890abcdeabcde будет храниться по адресу .../.git/objects/12/34567890abcdeabcde1234567890abcdeabcde1234567890abcdeabcde1234567890abcdeabcde. Когда база данных упакована, ее становится немного сложнее проверять вручную, но принцип тот же. - person Mark Adelsberger; 10.07.2017
comment
Превосходно. Умный дизайн, если быстро, что, очевидно, так и есть. BST, вероятно, проворачивает через это - person patrickkidd; 11.07.2017

Если файлы PDF не изменились одновременно с их перемещением, они будут иметь одинаковое значение хеш-функции для своего содержимого (даже если вы переименовали файл и переместили его в другой каталог).

Git обычно сам выясняет, что это перемещение/переименование, во время фиксации. Это потому, что он хэширует новые пути и обнаруживает, что уже знает о файлах с такими же хэшами. Затем он видит, что эти файлы были удалены, и выясняет, что вы только что переместили/переименовали.

person Dan Lowe    schedule 10.07.2017
comment
Он не понимает этого во время фиксации, потому что ему все равно. Он может идентифицировать пару операций (DELETE + ADD) как перемещение при представлении различий, слиянии, отображении статуса и т. д. - person Mark Adelsberger; 10.07.2017