в отличие от длинного относительного пути?
Как я могу запустить "git status" и просто получить имена файлов
Ответ 1
Вывод git status --porcelain
, разработанный для простого анализа в script, выводит полные пути, а не относительные пути, независимо от того, где ваш текущий каталог находится внутри дерева.
Каждый вывод строки git status --porcelain
имеет два ведущих символа, указывающих статус файла (например, независимо от того, не был ли он отслежен, изменен, новый, удален и т.д.), а затем пробел, поэтому, если вы просто хотите, чтобы все пути всего который будет указан в выводе git status
, вы можете сделать:
git status --porcelain | sed s/^...//
Ответ 2
Я думаю, что разрез хорош для этого.
git status -s | cut -c4-
Ответ 3
Ага, я думаю, что я просто понял вопрос: вы хотите basenames? Tack on | while read a; do basename "$a"; done
для любого из следующего:
как насчет
-
git diff --name-only
для изменений относительно индекса
-
git diff --name-only --staged
для... хорошо поставленных шагов:)
-
git diff --name-only HEAD
получили оба
Ответ 4
Чтобы получить только имена файлов, как вы просили:
git status --porcelain | sed -e 's!.*/!!'
Я не вижу, как это будет полезно.
Ответ 5
git status
всегда будет спускаться ( редактировать и вверх) дерево и отображать относительные пути. Если вам нужен только файл в каталоге, в котором вы находитесь, См. Этот связанный ответ
Ответ 6
Получить имя измененных файлов
git status --porcelain|awk '{if($1=="M") {print "basename " $2}}'|sh
Я использую аналогичный script для копирования моих измененных файлов на удаленный сервер, как показано ниже:
git status --porcelain|awk '{if($1=="M") {print "scp " $2 " [email protected]_ip:~/my_codebase/$(dirname " $2 ")/;"} }'|sh
Ответ 7
git status выводит относительные пути, поэтому, если вы cd в тот же каталог, что и файл (под вашим корнем для рабочего каталога), перед запуском состояния git, он будет выводить только базовые имена добавленных/поставленных файлов.
cd /long/path/to/my/repo/root/dir
"stuff" > ./newfile.txt
> git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: /long/path/to/my/repo/root/dir/plus/some/more/levels/of/directory/structure/inside/it/changed_file.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# long/path/to/my/repo/root/dir/plus/some/even/more/levels/of/directory/structure/inside/it/but_another_new_file.txt
# newfile.txt
no changes added to commit (use "git add" and/or "git commit -a")
ie, 'newfile.txt' указан без полного пути, потому что вы находитесь на том же пути, что и он.