我有该项目的工作副本,没有任何源代码控制元数据。现在,我想在此文件夹中执行与git-clone等效的操作,并保留我的本地更改。
git-clone不允许我克隆到现有文件夹。最佳做法是什么?
我有该项目的工作副本,没有任何源代码控制元数据。现在,我想在此文件夹中执行与git-clone等效的操作,并保留我的本地更改。
git-clone不允许我克隆到现有文件夹。最佳做法是什么?
Answers:
可以通过克隆到新目录,然后将.git
目录移到现有目录中来完成。
如果您现有的目录名为“代码”。
git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
也可以在克隆命令期间不执行检出操作来完成此操作。更多信息可以在这里找到。
git clone
用作第一个命令,就不需要进一步的checkout命令。如果您git clone --no-checkout
在第一步中使用类似的方法,那么在移动.git目录之后,有必要使用git reset HEAD
告诉git这些文件尚未删除。
git status
。
不要克隆,取而代之。在回购中:
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...
你就像被克隆了。
这里有趣的问题(还有一个没有答案的问题):如何找出裸树是基于哪个提交的,因此要重置到哪个位置。
我做了以下操作,以检出现有目录中的master分支:
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
-t
这里使用标志吗?
我想要git clone
一个新目录,然后将现有目录的内容复制到新克隆中。
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp
换句话说,将.git
目录移出临时克隆似乎比清除克隆的工作树并在其中复制现有文件更简单。
git mv tmp/.git .
回来fatal: cannot move directory over file, source=tmp/.git, destination=.git
。有人知道这个问题是什么吗?
mv
,而不是git mv
; 尽管这不能解释为什么您已经有一个.git
文件(包含gitdir: some/path/to/a/git-dir
一个“ gitfile”;如果不存在,则您会看到fatal: Not a git repository (or any of the parent directories): .git
)。
使用临时目录是可以的,但是如果您想避免该步骤,则可以使用该目录。从工作目录的根目录:
$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
git reset --hard origin/master
将删除所有本地文件。
hard
,并mixed
是混合将保持局部变化(所以如果您稍后尝试把它会告诉你如不能与底垫拉:你有不分阶段的变化,请提交或藏匿它们) ,尽管努力会放弃这些本地更改
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
git reset --hard
会否决本地文件更改,特别是不是此OP请求的更改。--mixed
应该改为使用。
要将git repo克隆到现有的空目录中,请执行以下操作:
cd myfolder
git clone https://myrepo.com/git.git .
注意命令.
末尾的git clone
。这将把仓库下载到当前的工作目录中。
fatal: destination path '.' already exists and is not an empty directory.
有两种方法。在可能的情况下,我将从新文件夹的干净文件夹开始,然后在以后复制您的版本。可能看起来像*:
mv $dir $dir.orig
git clone $url $dir
rsync -av --delete --exclude '.git' $dir.orig/ $dir/
rm -rf $dir.orig
此时,您应该拥有一个非常干净的工作副本,并将以前的工作文件夹作为当前工作目录,这样,如果您运行,任何更改(包括文件删除)都会显示在雷达上git status
。
另一方面,如果您确实必须这样做,则可以通过以下方式获得相同的结果:
cd $dir
git clone --no-checkout $url tempdir
mv tempdir/.git .
rmdir tempdir
git reset --mixed HEAD
无论哪种方式,我要做的第一件事就是运行类似的操作,git stash
以获取保留的所有本地更改的副本,然后您可以重新应用它们,并通过它们来确定要提交的更改。
* 两个示例都假定您从项目的父目录中的Shell开始。
这是我遇到的所有方法中最好的
将存储库的.git文件夹(不包括已存在的文件)克隆existing-dir
到一个空的临时目录中
git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
//可能需要--no-hardlinks来克隆本地仓库将.git文件夹移至包含文件的目录。这使existing-dir
一个git回购。
mv existing-dir/existing-dir.tmp/.git existing-dir/
删除临时目录
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git认为所有文件都已删除,这会将存储库的状态恢复为HEAD。
警告:文件的任何本地更改都将丢失。
git reset --mixed HEAD
如果您至少使用git 1.7.7(教clone
该--config
选项),请将当前目录转换为工作副本:
git clone example.com/my.git ./.git --mirror --config core.bare=false
这是通过以下方式工作的:
.git
文件夹中--mirror
根据.git
需要将新克隆放入纯元数据文件夹中--config core.bare=false
countermands隐含bare=true
的的--mirror
选项,从而使存储库有相关的工作目录和行为像一个正常的克隆如果.git
您希望将其转换为工作副本的目录中已经存在元数据目录,则这显然将无法工作。
[core]
本地配置中包含bare = true
和的部分 bare = false
。更具问题的是,它将为origin
远程服务器使用错误的值,[remote "origin"]
包括mirror = true
和在内的部分将对工作副本无法正常工作。解决这些问题之后,正常克隆并移动新的工作副本.git
将更加有效。
您可以通过递归键入以下命令行来做到这一点:
mkdir temp_dir // Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory