如何将 git 状态限制为仅当前目录中的常规文件?
How can I restrict git status to regular files in the current directory only?
我想查看当前目录的状态。因为子目录有很多变化,我不想看到,下面的命令不起作用:
git status .
除了 grepping git status
的输出之外,还有什么方法可以得到这种报告吗?
也许有更合适的方法,但您可以简单地
find . -maxdepth 1 -type f -print0 | xargs -0 git status
当然,如果当前目录中没有常规文件,这将失败。在那种情况下,你可以使用额外丑陋的版本
find . -maxdepth 1 -type f -print0 | xargs -0 git status nonexistentfile
而且,不,我不会解决您有一个名为 nonexistentfile
.
的文件的情况
使用git-status -- <pathspec>...
git-status
man page 的概要告诉您可以按路径过滤:
git status [<options>...] [--] [<pathspec>...]
因此,你所要做的就是获取当前目录下常规(非目录)文件对应的路径列表,并将其传递给git-status
。
有一个问题:因为 git status
报告 整个 存储库 如果传递一个空的 <pathspec>...
参数,您需要检查列表是否是是否为空
Shell 脚本
这是一个小 shell 脚本,可以执行您想要的操作。
#!/bin/sh
# git-status-dot
#
# Show the status of non-directory files (if any) in the working directory
#
# To make a Git alias called 'status-dot' out of this script,
# put the latter on your search path, make it executable, and run
#
# git config --global alias.status-dot '! git-status-dot'
# Because GIt aliases are run from the top-level directory of the repo,
# we need to change directory back to $GIT_PREFIX.
[ "$GIT_PREFIX" != "" ] && cd "$GIT_PREFIX"
# List Non-Directory Files in the Current Directory
lsnondirdot=$(ls -ap | grep -v /)
# If "lsnondirdot" is not empty, pass its value to "git status".
if [ -n "$lsnondirdot" ]
then
git status -- $lsnondirdot
else
printf "No non-directory files in the working directory\n"
fi
exit $?
有关为什么需要 GIT_PREFIX
恶作剧的更多详细信息,请参阅 git aliases operate in the wrong directory。
脚本可在 GitHub 的 Jubobs/git-aliases 获得。
创建一个 Git 别名
为方便起见,您可以创建一个调用脚本的Git别名;不过,请确保脚本在您的路径上。
git config --global alias.statusdot '!sh git-status-dot.sh'
玩具示例
这是一个玩具示例,演示如何使用生成的别名及其作用。
# initialize a repo
$ mkdir testgit
$ cd testgit
$ git init
# create two files
$ mkdir foo
$ touch foo/foo.txt
$ touch bar.txt
# good old git status reports that subdir/test1.txt is untracked...
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
bar.txt
foo/
nothing added to commit but untracked files present (use "git add" to track)
# ... whereas our new alias, git status-dot, only cares
# about regular files in the current directory
$ git status-dot
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
bar.txt
nothing added to commit but untracked files present (use "git add" to track)
# and if we delete README.md ...
$ rm README.md
# ... good old git status still bother us about /subdir ...
$ git status
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
foo/
nothing added to commit but untracked files present (use "git add" to track)
# ... whereas git statusdot doesn't
$ git status-dot
No non-directory files in the working directory
$
您可以使用:
git status | grep -v /
过滤掉任何包含斜杠 (/
) 的路径,这意味着它们在子目录中。
您还将失去已更改路径的 red/green 着色。
更新:
此解决方案不显示从当前目录移出或移入当前目录的文件,因为移动操作的源和目标显示在输出中的同一行。但是显示了在当前目录中重命名的文件(没有在目录之间移动)。
我认为答案是否定的...
除非文件是未跟踪文件、子模块或被忽略的文件。 status 命令的完整文档没有提及将输出限制到当前目录。
但是,您可能需要考虑使用 stash 命令来清理您的工作树。如果您将不在当前目录中的所有内容都存储起来(这需要 --patch
选项来仅存储选定的部分),那么 status
将仅显示您没有存储的内容。但是,如果你在工作时多次使用 stash
,那么你应该总是有一个干净的工作树,你可以从一开始就避免这个问题。每个工作主体都将打包在一个单独的存储中,等待您准备好提交。
当然,这对您当前的情况没有太大帮助(除了使用 (stash --patch
)。您可能想尝试的另一种选择是 [=14= 的 interactive mode ] 命令。然后你可以遍历所有更改的文件并有选择地添加你想要的文件(stash --patch
工作方式相同)。
或者,您可以使用其他答案中建议的 grep 解决方案。
我想查看当前目录的状态。因为子目录有很多变化,我不想看到,下面的命令不起作用:
git status .
除了 grepping git status
的输出之外,还有什么方法可以得到这种报告吗?
也许有更合适的方法,但您可以简单地
find . -maxdepth 1 -type f -print0 | xargs -0 git status
当然,如果当前目录中没有常规文件,这将失败。在那种情况下,你可以使用额外丑陋的版本
find . -maxdepth 1 -type f -print0 | xargs -0 git status nonexistentfile
而且,不,我不会解决您有一个名为 nonexistentfile
.
使用git-status -- <pathspec>...
git-status
man page 的概要告诉您可以按路径过滤:
git status [<options>...] [--] [<pathspec>...]
因此,你所要做的就是获取当前目录下常规(非目录)文件对应的路径列表,并将其传递给git-status
。
有一个问题:因为 git status
报告 整个 存储库 如果传递一个空的 <pathspec>...
参数,您需要检查列表是否是是否为空
Shell 脚本
这是一个小 shell 脚本,可以执行您想要的操作。
#!/bin/sh
# git-status-dot
#
# Show the status of non-directory files (if any) in the working directory
#
# To make a Git alias called 'status-dot' out of this script,
# put the latter on your search path, make it executable, and run
#
# git config --global alias.status-dot '! git-status-dot'
# Because GIt aliases are run from the top-level directory of the repo,
# we need to change directory back to $GIT_PREFIX.
[ "$GIT_PREFIX" != "" ] && cd "$GIT_PREFIX"
# List Non-Directory Files in the Current Directory
lsnondirdot=$(ls -ap | grep -v /)
# If "lsnondirdot" is not empty, pass its value to "git status".
if [ -n "$lsnondirdot" ]
then
git status -- $lsnondirdot
else
printf "No non-directory files in the working directory\n"
fi
exit $?
有关为什么需要 GIT_PREFIX
恶作剧的更多详细信息,请参阅 git aliases operate in the wrong directory。
脚本可在 GitHub 的 Jubobs/git-aliases 获得。
创建一个 Git 别名
为方便起见,您可以创建一个调用脚本的Git别名;不过,请确保脚本在您的路径上。
git config --global alias.statusdot '!sh git-status-dot.sh'
玩具示例
这是一个玩具示例,演示如何使用生成的别名及其作用。
# initialize a repo
$ mkdir testgit
$ cd testgit
$ git init
# create two files
$ mkdir foo
$ touch foo/foo.txt
$ touch bar.txt
# good old git status reports that subdir/test1.txt is untracked...
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
bar.txt
foo/
nothing added to commit but untracked files present (use "git add" to track)
# ... whereas our new alias, git status-dot, only cares
# about regular files in the current directory
$ git status-dot
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
bar.txt
nothing added to commit but untracked files present (use "git add" to track)
# and if we delete README.md ...
$ rm README.md
# ... good old git status still bother us about /subdir ...
$ git status
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
foo/
nothing added to commit but untracked files present (use "git add" to track)
# ... whereas git statusdot doesn't
$ git status-dot
No non-directory files in the working directory
$
您可以使用:
git status | grep -v /
过滤掉任何包含斜杠 (/
) 的路径,这意味着它们在子目录中。
您还将失去已更改路径的 red/green 着色。
更新:
此解决方案不显示从当前目录移出或移入当前目录的文件,因为移动操作的源和目标显示在输出中的同一行。但是显示了在当前目录中重命名的文件(没有在目录之间移动)。
我认为答案是否定的...
除非文件是未跟踪文件、子模块或被忽略的文件。 status 命令的完整文档没有提及将输出限制到当前目录。
但是,您可能需要考虑使用 stash 命令来清理您的工作树。如果您将不在当前目录中的所有内容都存储起来(这需要 --patch
选项来仅存储选定的部分),那么 status
将仅显示您没有存储的内容。但是,如果你在工作时多次使用 stash
,那么你应该总是有一个干净的工作树,你可以从一开始就避免这个问题。每个工作主体都将打包在一个单独的存储中,等待您准备好提交。
当然,这对您当前的情况没有太大帮助(除了使用 (stash --patch
)。您可能想尝试的另一种选择是 [=14= 的 interactive mode ] 命令。然后你可以遍历所有更改的文件并有选择地添加你想要的文件(stash --patch
工作方式相同)。
或者,您可以使用其他答案中建议的 grep 解决方案。