Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
`git签出分支--.`,不覆盖现有文件 上下文_Git_Powershell_Git Checkout - Fatal编程技术网

`git签出分支--.`,不覆盖现有文件 上下文

`git签出分支--.`,不覆盖现有文件 上下文,git,powershell,git-checkout,Git,Powershell,Git Checkout,我有一个包含应用程序开发历史的存储库。应用程序是从源代码动态编译的,在库被克隆后立即使用 应用程序使用了几个配置文件,这些配置文件在几个配置原型中被拒绝。为了便于部署,我希望将每个原型存储在单独的分支上,并从master获取应用程序和克隆后从所选分支获取配置 简单的解决方案是将配置分支建立在master的基础上,但这需要在master前进时定期重新对它们进行排序。因此,我正在尝试一个具有两个独立git历史记录的解决方案: master分支包含应用程序的源代码 所有config/相同的问题都有答

我有一个包含应用程序开发历史的存储库。应用程序是从源代码动态编译的,在库被克隆后立即使用

应用程序使用了几个配置文件,这些配置文件在几个配置原型中被拒绝。为了便于部署,我希望将每个原型存储在单独的分支上,并从
master
获取应用程序和克隆后从所选分支获取配置

简单的解决方案是将配置分支建立在
master
的基础上,但这需要在
master
前进时定期重新对它们进行排序。因此,我正在尝试一个具有两个独立git历史记录的解决方案:

  • master
    分支包含应用程序的源代码
  • 所有
    config/相同的问题都有答案(
    git archive mybranch | tar x--跳过旧文件
    ),但我遇到了一些问题:

    • 我在Windows上使用Powershell,它显然提供了一个本机
      tar
      命令,该命令没有
      ——跳过旧文件
      
      
    • Git版本的
      tar
      接受该标志,但由于我认为Powershell管道的工作方式有一个怪癖而失败(从Git Bash运行相同的命令):
    PS>&“C:\Program Files\Git\bin\Git.exe”存档母版|和“C:\Program Files\Git\usr\bin\tar.exe”x--跳过旧文件
    /usr/bin/tar:格式错误的扩展标头:缺少换行符
    /usr/bin/tar:用“.”替换空成员名
    /usr/bin/tar:用“.”替换空成员名
    /usr/bin/tar:跳到下一个标题
    /usr/bin/tar:由于以前的错误而以失败状态退出
    

    在这种环境下,我更喜欢只使用Git的解决方案。

    我不确定这是否正是您所需要的,但您可能希望使用
    合并
    ,这是解决冲突提交的标准方法,而不是部分
    签出

    考虑到您处于孤立分支上,您不能使用简单的
    git合并
    ,但必须指定选项
    --允许不相关的历史记录
    。由于您想编写脚本,因此不会有任何冲突:这应该是直接的,使用正确的合并策略,这可能是
    ours
    ,因为您处于
    config/
    中。您还希望您的孤立分支保持不变,仍然可以使用
    --no commit
    和下面的
    git reset--hard HEAD
    。最后,来自
    config/
    的merge命令可能是这样的(未测试):


    就我个人而言,我更喜欢
    git存档…|TAX-X跳过旧文件解决方案,但请考虑以下内容:

    • 你现在在某个孤儿分支B上。您的工作树中有一些文件集。在提取
      master
      的提示提交中显示的所有文件后,您希望这些相同的文件显示在工作树中

    • 因此,只有两种方法可以实现这一点:

    • master
      中提取文件,但不要接触任何现有文件:这是可以使用管道完成的解决方案,该管道在PowerShell中不起作用。您还可以构造一个相当奇特的“列出提交顶级中的所有文件和目录;对于每个这样的名称,测试它是否存在;如果不存在,则从提交;完成”循环中提取该名称
    • 将这些文件保存在某个地方:复制或移动它们,从主控文件中提取所有文件,然后将这些文件放回原处
    • 方法2相对简单。在没有子目录的情况下很容易实现。子目录的存在使这两种方法都有问题:如果工作树当前有一个目录
      d
      和一个文件
      f
      ,但是
      master
      上的提示提交有一个名为
      d
      的文件和/或一个名为
      f
      的目录,该怎么办?你希望这个案子有什么结果?(
      tar
      方法表示保留此处的内容,因此您将最终保存
      d/*
      f
      ,您可以选择使用方法2手动执行此操作。)


    一旦您决定如何处理目录/文件冲突,这对于git checkout来说也是一个困难的案例,顺便说一句,您可以用一些脚本语言编写其余部分来实现方法2。使用
    mktemp-d
    或等效工具在
    git签出期间隐藏所有现有文件

    PowerShell不直接支持在本机应用程序(*.exe)之间重定向二进制流。一种解决方法是让cmd.exe执行重定向:
    cmd/c“git archive master | tar x--跳过旧文件”
    @zett42这是我最后的选择,是的。。。虽然我确实希望有一个更优雅的解决方案:p“因此,我正在尝试一个解决方案,其中所有的config/都基于一个单独的根,用于构建应用程序的脚本首先从master检索其源代码(所有内容都正确地被忽略以防止意外提交),确保保留现有的配置文件(有效地覆盖默认配置文件)。“请您重新表述这句话好吗?我没有从这里得到问题部分的链接。@MarcoLuzzara哇,这个括号让我感觉很好。我把它全部改写成一个更有条理的段落。谢谢我知道会有一个意想不到的组合,可以做到这一点!虽然
    git reset--hard HEAD
    撤销了合并所做的操作,但是
    git reset
    工作得非常好<代码>--autostash
    可以添加用于处理更改文件的奖励积分:DGit已经提供了您通常需要的任何内容:)关于硬重置,我以为您想在脚本末尾(我是说合并之后)完全清除孤立分支,但我误解了
    git merge --allow-unrelated-histories -s recursive -Xours --no-commit master