标签: git

grep 在 git diff 中,但显示文件和行号

当我在分支上工作时,我想快速跳转到我的“TODO”评论。这意味着

  1. 我只想要添加到我的分支上的“TODO”注释(忽略 master 中的注释)
  2. 我希望每个匹配项都显示文件和行号。

我知道两个部分解决方案:git grep TODO具有正确的格式(将 grep.lineNumber 设置为 true),但结果太多。 git diff master... | grep TODO是一组很好的结果,但不显示文件和行号。

是否有一个选项可以告诉git diff每个更改的行添加文件名和行号前缀?(--line-prefix看起来很有希望,但似乎只需要一个固定的字符串。)

我可以通过--new-line-format=":%dn: %L"diff - 输出行号)吗git diff


例如,目前我的搜索结果如下所示:

$ git diff master... | grep TODO
+    // TODO use a non-fatal assertion
+        // TODO use a non-fatal assertion
+// TODO make this conditional too
Run Code Online (Sandbox Code Playgroud)

但理想情况下我想要这样:

src/foo/abc.cpp:221:+    // TODO use a non-fatal assertion
src/foo/xyz.cpp:934:+        // TODO use a non-fatal assertion …
Run Code Online (Sandbox Code Playgroud)

diff git

10
推荐指数
1
解决办法
3421
查看次数

git push 失败,远程:错误:钩子拒绝更新 refs/heads/master

我最近试图在社区 git 存储库上开始我自己的项目,但我遇到了一些麻烦。我是 git 的新手,但这是我一直在尝试做的事情来测试它。

我运行以下命令,它们都运行正常。

git config --global user.name "MYNAME"
git config --global user.email "MYEMAIL"
mkdir testproject
cd testproject
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin git@git.xxxxx.org:community/testproject.git
Run Code Online (Sandbox Code Playgroud)

并且所有上述命令都没有错误地运行。但是,当我运行下一个命令时,出现了一个巨大的错误。

git push -u origin master
Run Code Online (Sandbox Code Playgroud)

错误是。

Counting objects: 3, done.
Writing objects: 100% (3/3), 204 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
Username for 'http://git.xxxxxx.org': MYEMAIL
Password for 'http://MYEMAIL.com@git.xxxxxx.org': 
remote: /usr/local/lib/ruby/gems/2.0.0/gems/bundler-1.3.5/lib/bundler/spec_set.rb:92:in `block in materialize': Could not …
Run Code Online (Sandbox Code Playgroud)

git ruby

9
推荐指数
1
解决办法
5万
查看次数

是否可以从 git remote 的 URL 中删除“ssh://”?

我习惯于创建一些手动制作的存储库来将代码推送到我的宠物服务器或在我的公司内部共享代码。我使用 URLssh://user@ip/folder.git作为远程添加到我的工作区。

我想知道像 GitHub 这样的服务如何在没有协议规范的情况下设置存储库 URL,比如git@github.com:igorsantos07/Restler.git.

ssh git

9
推荐指数
1
解决办法
2836
查看次数

Rsync 文件夹,而 --exclude-from'ing .gitignore 文件在不同深度

所以我正在尝试使用命令来 rsync 具有如下结构的源文件夹:

- app.js
- .gitignore
- src/
- src/logs/
- src/logs/.gitignore
Run Code Online (Sandbox Code Playgroud)

第一个 .gitignore 将忽略一系列文件。典型的东西。第二个将如下所示:

*
!.gitignore
Run Code Online (Sandbox Code Playgroud)

当您想签入一个目录中没有任何文件时使用此技术。整个目录中可能还有更多 .gitignores - 这只是一种情况。所以我的问题是:是否可以让 rsync 解释相对于它们所在目录的所有 .gitignores?

我最初的尝试如下:

  1. Glob 目录中的所有 .gitignores。
  2. 构建命令看起来像:

rsync --exclude-from=.gitignore --exclude-from=src/logs/.gitignore --exclude-from=some/other/folder/.gitignore [source] [destination]

但是,这对我来说并没有达到预期。一切都被忽略了,因为它正在读取所有 .gitignore 文件,就好像它们在根目录下一样。有没有可能的方法来做到这一点,而不必为所有 .gitignores 进行 grep 并创建一个主文件,其中重写的路径都相对于根目录?

谢谢!

git rsync

9
推荐指数
1
解决办法
3411
查看次数

git alias shell 命令的错误

我在带有 git 1.7.1 的 cygwin 上使用 bash 版本 4.1.2(1)-release (x86_64-redhat-linux-gnu)。我想为需要使用输入参数两次的命令创建别名。按照这些说明,我写了

[alias]
branch-excise = !sh -c 'git branch -D $1; git push origin --delete $1' --
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

$> git branch-excise my-branch
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

我最后尝试了 a-和 a --,但我得到了同样的错误。我怎样才能解决这个问题?

bash git shell-script

9
推荐指数
1
解决办法
1559
查看次数

像 git 一样的彩色单词差异?

我一直在使用 git 的(彩色)--word-diff,我觉得它很棒。我今天发现自己处于一种情况,我需要一个字一个字地比较两个字符串,并渴望像 git 的 diff 这样的东西。

我知道wdiff+ colordiff,但它的结果肯定不是很好:

me@me:~$ wdiff <(echo -e "abc\ndef") <(echo -e "dbcx\ndef") | colordiff
[-abc-]{+dbcx+}
def
Run Code Online (Sandbox Code Playgroud)

周围有更好的选择吗?我不是特别喜欢那些[-,-]{+, +}

colors diff git colordiff

9
推荐指数
1
解决办法
2733
查看次数

找不到 Arch linux ca-certificates.crt

我在 Arch linux 中的证书有问题。好像找不到ca-certificates.crt。我已经更新了我的系统并安装了ca-certificates{,-utils,-mozilla}软件包,但它仍然无法正常工作。

git clone http://github.com/sstephenson/bats.git
Cloning into 'bats'...
fatal: unable to access 'https://github.com/sstephenson/bats.git/':     error setting certificate verify locations:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none
Run Code Online (Sandbox Code Playgroud)

arch-linux git curl certificates

9
推荐指数
1
解决办法
1万
查看次数

diff 仅显示已更改文件中的添加项

通常情况下diff,并git diff同时显示原始的和与修改后的行-+分别。有什么办法,我只能过滤才能看到修改后的行吗?这将立即将要读取的行数减少 2 倍。

我假设

git diff test.yml | grep '^+' | less -R
Run Code Online (Sandbox Code Playgroud)

git diff test.yml | egrep '^+' | less -R
Run Code Online (Sandbox Code Playgroud)

有相同的结果。即他们会在文件中显示任何新添加的内容。但是egrep向我展示了整个文件。为什么呢?

无论如何,使用上述方法,我失去了颜色。有什么办法可以保持颜色吗?

grep diff git

9
推荐指数
2
解决办法
1万
查看次数

显示按术语过滤的 git diff 的文件名

-n用作 grep 参数来显示行号,但-H不适用于文件名。我认为这是因为git diff默认情况下不会为每个更改的行输出文件名。在我打字时,我考虑了显示多行的另一种选择,它解决了我的直接问题,但仍然想知道显示实际文件名的解决方案。

[michael@bigbox www]$ git diff | grep -n -H "this->config"
(standard input):614:-        $config=json_decode($this->config,true);
[michael@bigbox www]$
Run Code Online (Sandbox Code Playgroud)

grep git

9
推荐指数
1
解决办法
2424
查看次数

zsh 提示:检查是否在 git 存储库中并且没有被 git 忽略

在我的zshshell 中,我根据我是否在git存储库中动态更改提示。我正在使用以下 git 命令来检查:

if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
...
Run Code Online (Sandbox Code Playgroud)

现在我还想区分当前目录是否被git. 所以我在我的if声明中又添加了一张支票:

if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1) && ! $(git check-ignore . >/dev/null 2>&1); then
...
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我想知道是否可以将其简化为一个git命令。由于在每个 上都会刷新提示ENTER,因此在某些较慢的机器上,它往往会显着降低 shell 的速度。

更新

@Stephen Kitt 接受的解决方案效果很好,但以下情况除外:

我正在跨文件系统使用存储库。让我们说 git 驻留在/.git(因为我想跟踪我的配置文件/etc),但我也想跟踪一些文件/var/foo,这是一个不同的分区/文件系统。

当我位于/并执行以下命令时,一切都按预期工作,并且我得到返回代码1(因为/var/foo正在被跟踪):

# git check-ignore -q /var/foo
Run Code Online (Sandbox Code Playgroud)

但是,当我位于 中的任何位置时/var,相同的命令会失败并显示错误代码128和以下错误消息:

# git check-ignore -q …
Run Code Online (Sandbox Code Playgroud)

prompt zsh git

9
推荐指数
2
解决办法
981
查看次数

标签 统计

git ×10

diff ×3

grep ×2

arch-linux ×1

bash ×1

certificates ×1

colordiff ×1

colors ×1

curl ×1

prompt ×1

rsync ×1

ruby ×1

shell-script ×1

ssh ×1

zsh ×1