Git псевдоним для добавления файлов и последующего отображения статуса из родительского каталога.

Вопрос или проблема

Я работаю на C# с Unity, и часто приходится работать с множеством файлов, которые не хочу коммитить. Мои изменения, которые я хочу закоммитить, почти всегда касаются исключительно файлов .cs. Я создал алиас в git, чтобы stage’ить все изменения в моих .cs файлах, игнорируя всё остальное. Этот алиас работал, но я понял, что после выполнения add я всегда проверяю результаты, вызывая git status, поэтому решил объединить оба действия в один алиас.

addcs = !git add ./\\*.cs && git status

Этот алиас работает, однако git status всегда показывает результаты так, как будто я вызываю его из родительской ветки.

Просто вызов git status может показать следующее:

На ветке main
Изменения, которые будут закоммичены:
  (используйте "git restore --staged <файл>...", чтобы убрать стадию)
    изменено:   Scripts/Foo.cs

Вызов моего алиаса, который внутри вызывает git status, показывает так:

На ветке main
Изменения, которые будут закоммичены:
  (используйте "git restore --staged <файл>...", чтобы убрать стадию)
    изменено:   ParentDirectory/Scripts/Foo.cs

Я пробовал альтернативный алиас, думая, что, возможно, ./ в моём алиасе как-то влияет на git status, но этот алиас не ведёт себя иначе:

addcs = !git add '**/*.cs' && git status

Мне интересно, знает ли кто-нибудь, почему git status может вести себя таким образом, и есть ли что-то, что я могу изменить в своём алиасе, чтобы избежать этого.

Ответ или решение

Проблема, с которой вы столкнулись, связана с контекстом, в котором вызывает команда git status в вашем алиасе. Когда вы используете команду git add с относительными путями, как ./*.cs или **/*.cs, это может не влиять на то, как Git отображает файлы в результате команды git status, если исходный путь к репозиторию оказывается не тем, что вы ожидаете.

Для того чтобы ваша команда правильно отображала статус файлов, вам следует воспользоваться командой cd, чтобы изменить директорию на директорию вашего репозитория перед выполнением git status. Можно переписать ваш алиас следующим образом:

addcs = !git add '*.cs' && git status

Однако, правильнее будет использовать && после смены директории, чтобы избежать возможных путаниц с текущей директорией. Добавив && cd перед вызовом git status, мы можем гарантировать, что команда git status будет выполнена в правильном контексте. Вот пример:

addcs = "!f() { git add '*.cs' && git status; }; f"

Тем не менее, важно убедиться, что алиас корректно работает с путями в зависимости от вашей операционной системы. Например, использование одинарных кавычек для glob-шаблонов допустимо не на всех системах, поэтому проверьте, чтобы это работало в вашей среде.

Такое изменение в алиасе поможет избежать путаницы с путями и обеспечит, что вы увидите ожидаемый вывод команды git status, как если бы вы её вызывали непосредственно из корневой директории вашего репозитория.

Если ваши .cs файлы находятся в разных подкаталогах, вы также можете воспользоваться следующей командой, которая добавляет все изменения и отображает статус для всех .cs файлов:

addcs = "!f() { git add ./*.cs && git status; }; f"

Не забудьте протестировать новый алиас, чтобы удостовериться, что он работает в соответствии с вашими ожиданиями.

Оцените материал
Добавить комментарий

Капча загружается...