Вопрос или проблема
Я работаю на 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"
Не забудьте протестировать новый алиас, чтобы удостовериться, что он работает в соответствии с вашими ожиданиями.