`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版本的
接受该标志,但由于我认为Powershell管道的工作方式有一个怪癖而失败(从Git Bash运行相同的命令):tar
- Git版本的
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
的merge命令可能是这样的(未测试):config/
就我个人而言,我更喜欢git存档…|TAX-X跳过旧文件解决方案,但请考虑以下内容:
- 你现在在某个孤儿分支B上。您的工作树中有一些文件集。在提取
的提示提交中显示的所有文件后,您希望这些相同的文件显示在工作树中master
- 因此,只有两种方法可以实现这一点:
- 从
中提取文件,但不要接触任何现有文件:这是可以使用管道完成的解决方案,该管道在PowerShell中不起作用。您还可以构造一个相当奇特的“列出提交顶级中的所有文件和目录;对于每个这样的名称,测试它是否存在;如果不存在,则从提交;完成”循环中提取该名称或master
- 将这些文件保存在某个地方:复制或移动它们,从主控文件中提取所有文件,然后将这些文件放回原处 方法2相对简单。在没有子目录的情况下很容易实现。子目录的存在使这两种方法都有问题:如果工作树当前有一个目录
和一个文件d
,但是f
上的提示提交有一个名为master
的文件和/或一个名为d
的目录,该怎么办?你希望这个案子有什么结果?(f
方法表示保留此处的内容,因此您将最终保存tar
和d/*
,您可以选择使用方法2手动执行此操作。)f
- 我在Windows上使用Powershell,它显然提供了一个本机
一旦您决定如何处理目录/文件冲突,这对于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