从git工作树的副本导入更改。

时间:2017-05-18 07:03:04

标签: git

我有一个没有.git文件夹的git工作树的副本。可以说它是使用以下命令创建的:

cd foo
git clone ORIGINURL .
git checkout MYBRANCH
rm -rf .git

它现在已手动更改,我想查看,提交并将这些更改推回MYBRANCH

我知道我可以将我的分支机构检出到其他位置,然后像这样复制.git文件夹:

cd ../bar
git clone ORIGINURL .
git checkout MYBRANCH
mv .git ../foo/
cd ../foo/
git status
...

或者我可以使用--work-tree--git-dir选项:

cd ../bar
git clone ORIGINURL .
git checkout MYBRANCH
git --work-tree=../foo --git-dir=.git status
...

是否有更好的方法(不创建冗余工作树)?我可以使用.git选项以某种方式获取--no-checkout文件夹,并指向MYBRANCH而无需实际结帐吗?

3 个答案:

答案 0 :(得分:2)

您可以使用--git-dir将当前工作目录(不是Git存储库)视为其他目录中Git存储库的工作树,这几乎与您的建议相同,但不是相当。例如,假设您现在位于$HOME/foo并且.git中有克隆(带有../bar目录),或../bar.git中有裸克隆。然后:

git --git-dir=$HOME/bar/.git --work-tree=. status

或:

git --git-dir=$HOME/bar.git --work-tree=. status

会将您当前的目录视为工作树。 (根据需要在../bar中替换 - 完整路径和相对路径都应该在这里工作。)当前分支仍然是主存储库的全局当前分支,但是...和索引这个工作树存储在Git目录中,这是不理想的。

这与您提议的内容基本相同,但步骤略少。请注意,如果使用 -bare存储库执行此操作,实际上它确实具有工作树(在此示例中为$HOME/bar),并且该工作树将不会同步以任何方式处理工作树(.又名$HOME/foo)。

如果你有Git 2.4或更高版本(我建议至少2.6左右),你也可以使用git worktree add在" main"之外创建新的工作树。工作树。每个"额外"工作树必须在一个独特的分支上,以避免工作树变得陈旧"问题。每个额外的工作树也有自己的索引,这解决了索引位置问题。

您可以在$HOME/bar中执行此操作,创建第三棵树:

git worktree add ../branch

创建$HOME/branch,其中branch已签出(或使用-b newbranch照常创建分支,就像通过git checkout -b一样)。然后,您可以删除该目录的内容,.git文件除外(请注意,这是一个文件!),并将其全部替换为$HOME/bar的内容。您甚至可以随机播放目录位置,虽然这比较棘手:有关详细信息,请参阅the DETAILS section of the git worktree documentation

答案 1 :(得分:1)

更改是在.git被删除后进行的,并且您没有进行备份,因此现在您无法生成差异,也无法跟踪更改。如何在没有差异的情况下查看更改?

如果您需要.gitMYBRANCH的数据,

cd foo
git init
git add .
git commit -m 'root'
git tag root
git fetch ORIGINURL MYBRANCH
git checkout -b MYBRANCH FETCH_HEAD
git cherry-pick root

由于在这种情况下无法进行三向合并,因此会产生冲突。解决所有冲突后,更改将作为新提交添加到MYBRANCH。然后是git push ORIGINURL HEAD:MYBRANCH

答案 2 :(得分:0)

要将.git目录插入已存在的工作树中,我通常会这样做:

https://stackoverflow.com/a/28180781/169947

简而言之,在您的工作树中,您可以这样做:

git clone --bare $URL .git
git config core.bare false