我怎样才能运行“混帐状态”,只获取文件名

而不是相对较长的path?

git status --porcelain的输出被devise成在脚本中很容易parsing,输出完整的path而不是相对path,而不pipe你的当前目录在树中的什么位置。

git status --porcelain输出的每一行都有两个主要的字符,表示文件的状态(例如是否跟踪,修改,新build,删除等),然后是一个空格,所以如果你只想要所有在你可以做的git status的输出中会提到:

 git status --porcelain | sed s/^...// 

我觉得削减对此是有好处的。

 git status -s | cut -c4- 

啊哈,我我只是明白了这个问题 :你想要基名? 坚持| while read a; do basename "$a"; done | while read a; do basename "$a"; done | while read a; do basename "$a"; done以下任何一项:

怎么样

  • git diff --name-only

    相对于索引的变化

  • git diff --name-only --staged

    为…以及上演的chages 🙂

  • git diff --name-only HEAD

    得到了两个

为了得到文件名 ,请按照你的要求:

 git status --porcelain | sed -e 's!.*/!!' 

我看不出这会如何有用。

git status将总是走下来( 编辑并向上)树并显示相对path。 如果你只想要你目录中的文件, 请参阅相关的答案

获取修改文件的名称

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 

git status会输出相对path,所以如果你在运行git status之前把文件cd(在你的工作目录的根目录下)cd到同一目录下,它将只输出被添加/ stage的文件的基名。

 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”没有完整的path列出,因为你在同一条path。