我有一个项目的工作副本,没有任何源控制元数据 . 现在,我想在这个文件夹中执行相当于git-clone的操作,并保留我的本地更改 .
git-clone不允许我克隆到现有文件夹中 . 这里的最佳做法是什么?
使用临时目录很好,但如果你想避免这一步,这将有效 . 从工作目录的根目录:
$ rm -fr .git $ git init $ git remote add origin your-git-url $ git fetch $ git reset --mixed origin/master
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
这可以通过克隆到新目录,然后将 .git 目录移动到现有目录中来完成 .
.git
如果现有目录名为“code” .
git clone https://myrepo.com/git.git temp mv temp/.git code/.git rm -rf temp
这也可以在克隆命令期间不进行结账时完成;更多信息可以在here找到 .
不要克隆,取而代之 . 在回购:
git init git remote add origin $url_of_clone_source git fetch origin git checkout -b master --track origin/master # origin/master is clone's default
然后,您可以重置树以获得所需的提交:
git reset origin/master # or whatever commit you think is proper...
而你就像克隆了一样 .
这里有趣的问题(和没有回答的问题):如何找出你的裸树所基于的提交,因此要重置到哪个位置 .
我将 git clone 添加到新目录并将现有目录的内容复制到新克隆 .
git clone
以下我做了,检查现有目录中的主分支:
git init git remote add origin [my-repo] git fetch git checkout origin/master -ft
这有两种方法 . 在可能的情况下,我会从一个干净的文件夹开始,为你的新git工作目录,然后在以后复制你的版本的东西 . 这可能看起来像*:
mv $dir $dir.orig git clone $url $dir rsync -av --delete --exclude '.git' $dir.orig/ $dir/ rm -rf $dir.orig
此时,您应该拥有一个非常干净的工作副本,并将您之前的工作文件夹作为当前工作目录,因此如果您运行 git status ,任何更改包括文件删除都将显示在雷达上 .
git status
另一方面,如果你真的必须反过来做,你可以得到相同的结果,如下所示:
cd $dir git clone --no-checkout $url tempdir mv tempdir/.git . rmdir tempdir git reset --mixed HEAD
无论哪种方式,我要做的第一件事就是运行像 git stash 之类的东西来获取所有本地更改的副本,然后你可以重新应用它们并处理你想要提交的那些 .
git stash
*这两个示例都假设您从项目父目录中的shell开始 .
要将git repo克隆到空的现有目录,请执行以下操作:
cd myfolder git clone https://myrepo.com/git.git .
注意 git clone 命令末尾的 . . 这将把repo下载到当前的工作目录中 .
.
很多答案已经按照OP的要求做了 . 但值得注意的是,以相反的方式做到这一点要简单得多:
git clone repo-url tmp/ cp -R working/ tmp/
您现在具有所需的目标状态 - 新克隆本地更改 .
This is the Best of all methods i came across
将存储库的.git文件夹(不包括文件,因为它们已经在 existing-dir 中)克隆到一个空的临时目录中
existing-dir
git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
将.git文件夹移动到包含这些文件的目录 . 这使 existing-dir 成为一个git repo .
mv existing-dir/existing-dir.tmp/.git existing-dir/
删除临时目录
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git认为所有文件都被删除,这会将repo的状态恢复为HEAD .
警告:文件的任何本地更改都将丢失 .
git reset --hard HEAD
如果您至少使用git 1.7.7(其中教授 clone --config 选项),则将当前目录转换为工作副本:
clone
--config
git clone example.com/my.git ./.git --mirror --config core.bare=false
这适用于:
将存储库克隆到新的 .git 文件夹中
--mirror 使新克隆成为纯粹的元数据文件夹,因为 .git 需要
--mirror
--config core.bare=false 对 --mirror 选项的隐式 bare=true 进行了反击,从而允许存储库具有关联的工作目录,并且像普通克隆一样运行
--config core.bare=false
bare=true
如果您希望转换为工作副本的目录中已存在 .git 元数据目录,这显然不起作用 .
通常我会首先克隆初始存储库,然后将现有文件夹中的所有内容移动到初始存储库 . 它每次都有效 .
此方法的优点是您不会遗漏任何初始存储库,包括README或.gitignore .
您还可以使用以下命令完成以下步骤:
$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo
12 回答
使用临时目录很好,但如果你想避免这一步,这将有效 . 从工作目录的根目录:
这可以通过克隆到新目录,然后将
.git
目录移动到现有目录中来完成 .如果现有目录名为“code” .
这也可以在克隆命令期间不进行结账时完成;更多信息可以在here找到 .
不要克隆,取而代之 . 在回购:
然后,您可以重置树以获得所需的提交:
而你就像克隆了一样 .
这里有趣的问题(和没有回答的问题):如何找出你的裸树所基于的提交,因此要重置到哪个位置 .
我将
git clone
添加到新目录并将现有目录的内容复制到新克隆 .以下我做了,检查现有目录中的主分支:
这有两种方法 . 在可能的情况下,我会从一个干净的文件夹开始,为你的新git工作目录,然后在以后复制你的版本的东西 . 这可能看起来像*:
此时,您应该拥有一个非常干净的工作副本,并将您之前的工作文件夹作为当前工作目录,因此如果您运行
git status
,任何更改包括文件删除都将显示在雷达上 .另一方面,如果你真的必须反过来做,你可以得到相同的结果,如下所示:
无论哪种方式,我要做的第一件事就是运行像
git stash
之类的东西来获取所有本地更改的副本,然后你可以重新应用它们并处理你想要提交的那些 .*这两个示例都假设您从项目父目录中的shell开始 .
要将git repo克隆到空的现有目录,请执行以下操作:
注意
git clone
命令末尾的.
. 这将把repo下载到当前的工作目录中 .很多答案已经按照OP的要求做了 . 但值得注意的是,以相反的方式做到这一点要简单得多:
您现在具有所需的目标状态 - 新克隆本地更改 .
This is the Best of all methods i came across
将存储库的.git文件夹(不包括文件,因为它们已经在
existing-dir
中)克隆到一个空的临时目录中git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
//可能需要--no-hardlinks来克隆本地仓库将.git文件夹移动到包含这些文件的目录 . 这使
existing-dir
成为一个git repo .mv existing-dir/existing-dir.tmp/.git existing-dir/
删除临时目录
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git认为所有文件都被删除,这会将repo的状态恢复为HEAD .
警告:文件的任何本地更改都将丢失 .
git reset --hard HEAD
如果您至少使用git 1.7.7(其中教授
clone
--config
选项),则将当前目录转换为工作副本:这适用于:
将存储库克隆到新的
.git
文件夹中--mirror
使新克隆成为纯粹的元数据文件夹,因为.git
需要--config core.bare=false
对--mirror
选项的隐式bare=true
进行了反击,从而允许存储库具有关联的工作目录,并且像普通克隆一样运行如果您希望转换为工作副本的目录中已存在
.git
元数据目录,这显然不起作用 .通常我会首先克隆初始存储库,然后将现有文件夹中的所有内容移动到初始存储库 . 它每次都有效 .
此方法的优点是您不会遗漏任何初始存储库,包括README或.gitignore .
您还可以使用以下命令完成以下步骤: