与长相对路径相反?
答案 0 :(得分:67)
git status --porcelain
的输出设计为易于在脚本中解析,无论当前目录在树中的位置如何,都会输出完整路径而不是相对路径。
git status --porcelain
输出的每一行都有两个前导字符,表示文件的状态(例如,它是未跟踪,修改,新建,删除等)后跟一个空格,所以如果你只想要完整的路径你可以做的git status
输出中提到的所有内容:
git status --porcelain | sed s/^...//
答案 1 :(得分:50)
我认为削减对此有好处。
git status -s | cut -c4-
答案 2 :(得分:40)
啊哈,我认为我只是明白了这个问题:你想要基地名吗?将| while read a; do basename "$a"; done
加入以下任何一项:
怎么样
git diff --name-only
有关索引的更改
git diff --name-only --staged
for ... well staged chages:)
git diff --name-only HEAD
得到了两个
答案 3 :(得分:7)
按照您的要求仅获取文件名:
git status --porcelain | sed -e 's!.*/!!'
我看不出这有用。
答案 4 :(得分:3)
git status
将始终向下走(编辑及向上)树并显示相对路径。如果您只想要所在目录中的文件See this related answer
答案 5 :(得分:3)
获取已修改文件的名称
git status --porcelain|awk '{if($1=="M") {print "basename " $2}}'|sh
我使用类似的脚本将修改后的文件复制到远程服务器,如下所示:
git status --porcelain|awk '{if($1=="M") {print "scp " $2 " account_name@server_ip:~/my_codebase/$(dirname " $2 ")/;"} }'|sh
答案 6 :(得分:2)
git status输出相对路径所以如果你在运行git status之前cd到与文件相同的目录(在你工作目录的root下),它只会输出添加/暂存文件的基本名称。
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")
即,列出'newfile.txt'时没有完整路径,因为你的路径与它相同。
答案 7 :(得分:1)
除了可接受的答案外,另一种解决方法是使用awk
git status --porcelain | awk '{ print $2 }'
$2
选择每一行的第二列。
答案 8 :(得分:0)
使用ls-files
内置到git
中的简单得多的解决方案。
从文档中
选项
-c --cached在输出中显示缓存的文件(默认)
-d --deleted在输出中显示已删除的文件
-米 --modified在输出中显示修改后的文件
-o --others在输出中显示其他文件(即未跟踪的文件)
-i --ignored仅在输出中显示忽略的文件。在索引中显示文件时,仅打印与排除模式匹配的文件。什么时候 显示“其他”文件,仅显示与排除模式匹配的文件。 标准忽略规则不会自动激活,因此在 至少需要--exclude *选项之一。
-s --stage在输出中显示暂存内容的模式位,对象名称和暂存号。
-u --unmerged在输出中显示未合并的文件(强制--stage)
显示标志的示例也可以组合:
git ls-files -dmo