我有一个没有.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
而无需实际结帐吗?
答案 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
被删除后进行的,并且您没有进行备份,因此现在您无法生成差异,也无法跟踪更改。如何在没有差异的情况下查看更改?
如果您需要.git
或MYBRANCH
的数据,
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