【问题标题】:Keep specific files of two Git branches in-sync保持两个 Git 分支的特定文件同步
【发布时间】:2014-05-31 09:15:14
【问题描述】:

我在主分支中有一个由四个文件组成的存储库:两个项目文件(顺便说一句 PHP 文件)加上一个 README.md.gitignore。我想创建一个额外的分支,它只包含相同提交级别的两个 PHP 文件。保持这两个分支同步的最佳做法是什么?如果可能的话,我只想提交一次以更新我的 PHP 文件?

我之所以研究这个,是因为我想创建一个名为 dist 的分支,它只包含基本文件。

【问题讨论】:

  • 2个文件值得吗?自述文件通常对保留很有用
  • @exussum 我一般同意,但在这种情况下,分发这些文件实际上可能是致命的

标签: git github git-branch


【解决方案1】:

创建你的dist 分支,记录你不想要的文件的删除。

git checkout master
git checkout -b dist
git rm .gitignore
git rm README.md
git commit -m "Remove non-dist files"

然后,每次你想更新你的 dist 分支时,只需 rebase 它:

git checkout dist
git rebase master

master 之上重放您的dist 提交(您在创建该分支时所做的,以及您在git rm 某些文件的位置),这意味着它将始终删除额外的文件。

你必须force push it to your remote,但这不是问题,因为没有人应该为该分支做出贡献。


话虽如此,发布管理通常不是通过分支来维护,而是使用能够从源代码打包和发布的脚本(这里指的是您在 master 分支中执行的一个脚本,以便复制所需的内容您要部署的位置)。

【讨论】:

  • 谢谢@VonC,我会试试的。我之前还没有使用过 rebase(我想!),但是我每次提交时都不需要重复所有这些步骤吗?我还偶然发现了this method,它可能需要更少的交互。
  • 提供一些背景,说明我为什么要实现这一目标。我为我的 Sublime Text 插件创建了一个basic linter。这个 linter 基本上由 npm 包、grunt 任务和.travis.yml 组成。虽然 master 分支带有 README.md.gitignore,但我不希望这些文件在 dist 分支中,因为它是专门用于 Fetch 的。无需干涉用户自己的README.md.gitignore 文件。
【解决方案2】:

正如@VonC 所说,Git 没有设置为发布管理或部署工具。你不是第一个注意到它非常接近的人:-)——所以很容易让它做你想做的事。

以下是仅使用所需内容制作可提交树的方法,无需结帐。把它放在.git/post-commit 中,也许从.git/hooks/post-merge 链接到它,从那时起分支会自动维护。

#!/bin/sh
files="this.php that/other.php"
branch=pub

# build a tree with selected already-committed content
new_tree=$(
  export GIT_INDEX_FILE=.git/sideband-index
  git read-tree --empty
  git ls-tree HEAD --  $files \
  | git update-index --index-info --add
  git write-tree
);

# commit the new tree to the tip of "$branch"
# if it doesn't match what's already there
current=$(git rev-parse -q --verify $branch:)
test $new_tree != "$current" \
&& git update-ref refs/heads/$branch $(
    git commit-tree ${current:+-p $branch} -m new\ content $new_tree
)

不熟悉的命令(几乎所有命令,在这里)都是为脚本编写者使用而构建的,它们就是为此而设计的。

【讨论】:

  • 我明白你在stackoverflow.com/questions/23962446/… 中所说的,但是来吧:我提出的变基?当然,这并没有超出 OP 的舒适区;)无论如何,+1。
  • @VonC 你说得对,当然,我有点懒了。
  • 我正在尝试使用该脚本,但它在代码的最后一行出现了问题。我认为这与左花括号不匹配右括号有关。另外,“+-p”中的“+”是否正确?
  • @Wookiem Yow。感谢您指出不匹配的大括号,已修复。 :+ 是 shell 扩展语法,表示“如果变量不为空,则替换后面的内容”,如果 current 中有任何内容,shell 将在 -p $branch 中进行替换。
猜你喜欢
  • 1970-01-01
  • 2023-01-20
  • 2011-12-01
  • 2015-04-20
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
相关资源
最近更新 更多