有什么方法可以获取我输入以下内容时将提交的文件列表吗?
git commit -m "my changes"
Run Code Online (Sandbox Code Playgroud)
git status列出太多了.我可以删除所有的单词,但我宁愿不.而且我不想被告知未跟踪的文件.
我试过了
git ls-files -md
Run Code Online (Sandbox Code Playgroud)
但是这并没有显示最近添加但尚未提交的文件.
我正在寻找你得到的相同输出
svn status -q
Run Code Online (Sandbox Code Playgroud)
例如$ svn status -q
一个file.py
M dir/database.py
M start.py
考虑一个文件(1.c)包含作者M和J所做的三个函数和更改.如果有人运行git blame 1.c,他将获得以下输出:
^869c699 (M 2012-09-25 14:05:31 -0600 1)
de24af82 (J 2012-09-25 14:23:52 -0600 2)
de24af82 (J 2012-09-25 14:23:52 -0600 3)
de24af82 (J 2012-09-25 14:23:52 -0600 4) public int add(int x, int y) {
de24af82 (J 2012-09-25 14:23:52 -0600 5) int z = x+y;
de24af82 (J 2012-09-25 14:23:52 -0600 6) return z;
de24af82 (J 2012-09-25 14:23:52 -0600 7) }
de24af82 (J 2012-09-25 14:23:52 -0600 8)
^869c699 (M 2012-09-25 14:05:31 -0600 9) public int multiplication(int y, int z){
^869c699 …Run Code Online (Sandbox Code Playgroud) 我的文件系统上有一堆(10-15)本地git存储库,但所有文件夹/ data /
我想找到所有/任何具有未经修改的更改的文件夹.我怎样才能做到这一点?有点像递归的全局git status变体.
我认为所有答案都错了.任何git命令只能在git控件下的文件夹中工作.我需要一些东西来搜索这样的文件夹.
所以我写了这个脚本来做到这一点:
#!/usr/bin/env ruby
require 'find'
require 'fileutils'
#supply directory to search in as argument
@pat = ARGV[0]
(puts "directory argument required"; exit) unless @pat
Dir.chdir(@pat)
Find.find(@pat) do |path|
if FileTest.directory?(path)
Dir.chdir(path)
resp = `git status 2>&1`
unless resp =~ /fatal|nothing to commit \(working directory clean\)/i
puts "#{'#'*10}\n#{Dir.pwd}#{'#'*10}\n#{resp}"
Find.prune
end
Dir.chdir(@pat)
end
end
Run Code Online (Sandbox Code Playgroud) 一家公司让我为他们编写一个GIT包装器.
那里的人们绝对没有版本控制系统经验,但最终会通过我的程序将其纳入日常工作中.
我打算使用VC++创建一个小小的Windows小程序,这将有助于ppl在这个过程中.有什么想法吗?
如果Deamon进程检查人们是否想要提交/推送他们的文件呢?
有没有人知道一个git管道(绝对不是瓷器)的方法来确定是否:
我希望以编程方式确定这个,因此不想用瓷器和各种sed-fu来解决这个问题.
git status --porcelain如果您以编程方式解析当前的git分支状态,我会阅读其他各种SO帖子和Google搜索结果,这些结果并不是您想要依赖的命令.我终于指出rev-parse,diff-index和diff-files命令这样做-不过,我目前使用的方法是一个小马车,特别是在比主等分支机构.像oh-my-zsh这样的主题似乎正在使用git status --porcelain,我上面提到的并不是Git社区推荐的.那么阅读这些分支状态的正确方法是什么?
来自Bureau Oh-My-ZSH主题的代码段,以便清楚我正在尝试重现的行为.
bureau_git_status () {
_INDEX=$(command git status --porcelain -b 2> /dev/null)
_STATUS=""
if $(echo "$_INDEX" | grep '^[AMRD]. ' &> /dev/null); then
_STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_STAGED"
fi
if $(echo "$_INDEX" | grep '^.[MTD] ' &> /dev/null); then
_STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNSTAGED"
fi
if $(echo "$_INDEX" | command grep -E '^\?\? ' &> /dev/null); then
_STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNTRACKED"
fi
if $(echo "$_INDEX" | grep '^UU ' &> /dev/null); then
_STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNMERGED"
fi
if $(command git …Run Code Online (Sandbox Code Playgroud) 之前的一个问题产生了一些关于如何检查你的Git repo是否包含脏索引或未跟踪文件的想法.我从讨论中得出的答案如下:
#!/bin/sh
exit $(git status --porcelain | wc -l)
Run Code Online (Sandbox Code Playgroud)
这个答案背后的想法是模仿程序员会做什么:运行git status然后检查输出.
不幸的是git status --porcelain,git status并没有完全相同的事情.特别是,git status将报告未按下的更改,而git status --porcelain不会.这是一个例子
[jarmo@localhost math-hl]$ git status --porcelain
[jarmo@localhost math-hl]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:我需要添加到原始脚本中以确定何时repo已经未按下更改?特别是,这是一种正确的方法吗?
#!/bin/bash
if [ $(git status --porcelain | wc -l) != …Run Code Online (Sandbox Code Playgroud) 消息
Cloning into 'sub-mod'...
done.
Run Code Online (Sandbox Code Playgroud)
git submodule add...将命令写入stderr后。我希望该消息被写入标准输出,因为我不认为它表明命令出了问题。
我可以使用以下命令序列重现此内容:
rm -rf /tmp/repo /tmp/module
mkdir /tmp/repo /tmp/module
cd /tmp/module
git init > /dev/null
echo "foo" > foo;
git add foo > /dev/null
git commit . -m "+ foo" > /dev/null
cd /tmp/repo
git init > /dev/null
git submodule add /tmp/module/ sub-mod 1> /dev/null
Run Code Online (Sandbox Code Playgroud)
如果我将最后一个命令中的重定向更改为... 2> /dev/null,则不会打印任何内容。
请观察:
C:\Dayforce\test [master ?2 +0 ~2 -0 !]> git pull
error: Your local changes to the following files would be overwritten by merge:
2.txt
Please commit your changes or stash them before you merge.
Aborting
Updating 2dc8bd0..ea343f8
C:\Dayforce\test [master ?2 +0 ~2 -0 !]>
Run Code Online (Sandbox Code Playgroud)
git有一个命令,可以告诉我哪些未提交的文件导致此错误?我可以通过git pull看到它们显示,但我真的不想解析git pull输出.
我完全了解pull.rebase和rebase.autostash配置选项,请不要提起它们.
编辑1
可以先执行git pull.实际上,识别有问题文件的逻辑将在git pull失败后完成.我在Powershell中认识到的方式是:
git pull
# Possible exit codes:
# 1 - either local changes or pull merge conflict (but the merge has …Run Code Online (Sandbox Code Playgroud) 我想获取符合某些条件的提交中更改的所有文件.所以我有以下内容:git log --grep=123,我需要将提交中更改的文件作为聚合列表进行更改,例如,如果文件在多次提交中更改,则应在结果列表中仅包含一次.这就像在togoise svn log window中选择几个提交一样,它列出了所选提交中更改的所有文件