如何运行“git status”并获取文件名

时间:2011-03-08 20:00:28

标签: git version-control

与长相对路径相反?

9 个答案:

答案 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