【问题标题】:Howto "git ls" files marked by git as "deleted by us"如何“git ls”被git标记为“被我们删除”的文件
【发布时间】:2016-03-23 17:24:40
【问题描述】:

我开始使用 git cherrypick;因此,我现在(经常)面临着给我很多标记为“被我们删除”的文件的情况。

我看到this other question,上面提到了如何使用git ls-files --deleted 获取平面文件列表;然后可以通过管道传输到 xargs rm。

问题是:--deleted 没有列出那些“被我们删除”的文件。

那么,长话短说:删除“被我们删除”文件的最简单/直接的方法是什么?

(我真的很喜欢 git ls-files 方法;因为它不需要 sed/awk 魔法;所以也不用担心得到正确的引号......)

更新;只是为了解释为什么这不是一些“XY问题”的情况:

  • 其实我用的是git svn;连接到一些后端 SVN 服务器
  • SVN 主干包含目录 A、B、C
  • 我正在对影响所有三个目录的 trunk 进行更改
  • 但是:我运行cherry-pick ...的git实际上类似于在SVN服务器上创建的“产品分支”。这些“产品”分支确实只包含子集(所以一个有 A 和 B;另一个有 B 和 C)。
  • 我努力了;但我真的无法同时创建一个包含 SVN 主干和 SVN 产品分支的 git svn 克隆

【问题讨论】:

  • “被我们删除”究竟是什么意思?
  • git ls-files --deleted | xargs rm 对于需要引用的文件名不安全。只是为了记录。为此,您需要git ls-files -z --deleted | xargs -0 rm。
  • 真正的问题是为什么你经常删除你分支上的文件,而其他人正在他们的分支上更改?

标签: git shell


【解决方案1】:

我不知道这样的“简单”命令,但您可以为此使用 git status 本身。

while read -d '' status file; do
    case "$status" in
        (D?)
            echo "Removing $file that was deleted by us."
            #rm "./$file"
            ;;
    esac
    #printf 'status: %q\nfilename: %q\n' "$status" "$file"
done < <(git status -sz)

要仅匹配 DU 而不是 D?(D 单字符),请适当更改大小写模式。

要运行rm 一次,请在if 块中使用files+=("$file"),然后在最后使用rm "${files[@]}"。

【讨论】:

  • 不起作用。当我运行命令时,我得到如下输出:filename: /some/real/file \n File was deleted by us.\n status: DU(\n 由我自己插入以指示换行符)。
  • 那不起作用怎么办? (假设你报告的输出乱序。)这个 sn-p 应该只输出每个有差异的文件,也为我们删除的每个文件输出File ... was deleted by us.。
  • 重点是:它打印“文件已被我们删除”。 $filename 似乎是空的。而且,与此同时,我找到了一个不错的解决方案;这对于我们正在使用的文件集git status --porcelain | grep "DU " | cut -d " " -f2 | xargs git rm 来说已经足够好了(基于 git status 在使用该选项调用时实际上会提供不同的输出(D 与 DU)这一事实)
  • 哦,那是因为我打错了变量名。在消息中使用$file,它会起作用。
  • -z 是 --porcelain -z 是的,您可以使用 grep 和 cut 和 xargs 来执行此操作,或者您可以使用 shell 循环并调用 rm N 次或者将文件名收集到一个数组中,最后调用一次rm。
【解决方案2】:

要列出标记为“被我们删除”的未合并文件,可以使用以下命令:

git status --porcelain --untracked-files=no | sed --silent 's/^DU //p'

或稍短的变体:

git status --porcelain -uno | sed -n 's/^DU //p'

在命令git status --porcelain 的输出中,未合并的“已被我们删除”文件标有DU。

在sed 中,选项-n 禁止打印,除非明确请求,命令s/X/Y/ 将X(正则表达式)替换为Y,并且由于p 标志,打印修改的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 2017-06-29
    • 1970-01-01
    • 2019-10-07
    • 2011-10-13
    • 2013-10-30
    • 2018-12-29
    相关资源
    最近更新 更多