0

我有一个分支 A 并想列出一个对其进行重大更改的列表。这些更改的最终结果已经存在于目录 B 中,我也想成为新的工作副本。从本质上讲,我只想“将此目录设为我的分支的最新工作副本”。

我目前知道有两种可能性来实现这一目标:

  1. 将 A 签出到临时目录 C,删除除“.git”之外的所有内容,将目录 B 的内容复制到 C,然后从目录 C 添加/提交/推送。最后,将 C 的全部内容移回 B。
  2. 克隆存储库而不签出到临时目录 C,将“.git”目录从 C 移动到 B。从 B 中添加/提交/推送。

这两种解决方案的问题,除了非常笨拙之外,还需要目录 B 和 C 的磁盘空间。选项 1 还涉及更多的文件混洗。所以目前我对此的最佳解决方案是选项 2,详细步骤如下。

我想有一个更好的方法可以使用“reset”或“symbolic-ref”来做到这一点。我尝试了各种选择但没有成功。

mkdir /tmp/git_output
cd /tmp/git_output
git init
git remote add origin /path_or_url_to/git/repo.git
git fetch
git checkout name_of_branch
mv .git /path/to/new/src/
cd /path/to/new/src/
git commit -a
git push
rm -rf /tmp/git_output

谢谢你的帮助。

4

2 回答 2

1

我认为应该可以从您的工作副本中删除所有内容(确保不要删除您的.git文件夹 - 进行备份!)。然后,复制目录的内容Bgit add -u取决于您的 Git 版本)以从索引中删除丢失的文件并将新文件添加到索引中。犯罪。要开心。


我能想到的另一种方法是在你的目录中初始化一个新的 Git 存储库B,提交所有文件,然后推送到 A: cd B; git init; git add .; git commit -m 'complete rewrite'; git push /path/to/A HEAD:rewrite

现在,在 中A,创建一个嫁接,告诉 Git 分支的尖端有分支的rewrite尖端作为其父级。然后运行以使该移植物永久化。masterAgit filter-branch

于 2014-05-06T14:59:02.573 回答
0
git checkout A
GIT_WORK_TREE=path/to/B git add -An .   # take out the `n` to actually do it
git commit
git checkout as-you-were

(编辑:如果您已经在分支 A 上,您需要在git reset --hard之后刷新您的真实工作树。)

如果您想获得更底层的信息,您可以在没有结帐的情况下执行此操作:

(
  export GIT_INDEX_FILE=.git/sideband-index
  export GIT_WORK_TREE=path/to/B
  cp .git/HEAD{,~}
  git symbolic-ref HEAD refs/heads/A
  git add -A .
  git commit
  mv .git/HEAD{~,}
)

甚至

(
  export GIT_INDEX_FILE=`mktemp -u`
  export GIT_WORK_TREE=path/to/B
  git add -A .
  git update-ref A $(git commit-tree -m 'hi there!' -p A $(git write-tree))
)
于 2014-05-06T16:39:04.257 回答