如何将目录的当前内容初始化为git分支的状态?

时间:2014-05-06 14:55:22

标签: git branch working-copy

我有一个分支A,想要列出一个非常重要的变化列表。这些更改的最终结果已存在于目录B中,我也希望成为新的工作副本。在本质上,我只想"使这个目录成为我的分支的最新工作副本。"

我目前有两种可能的方法来实现这一目标:

  1. Checkout A进入临时目录C,删除除" .git"以外的所有内容,将目录B的内容复制到C中,然后从目录C中添加/ commit / push。最后,移动整个内容C回到B。
  2. 将没有签出的存储库克隆到临时目录C中,移动" .git"目录从C到B.添加/提交/推送从B。
  3. 这两个解决方案的问题,除了可怕的笨重之外,是它们需要磁盘空间用于目录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
    

    感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为应该可以删除工作副本中的所有内容(确保三倍确定删除.git文件夹 - 进行备份!)。然后,复制目录Bgit add -u的内容(取决于您的Git的反面),从索引中删除丢失的文件,并将新文件添加到索引中。承诺。快乐。


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

现在,在A中,创建一个移植,告诉Git,分支rewrite的提示将master的分支A作为其父级。然后运行git filter-branch使该移植物永久化。

答案 1 :(得分: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))
)