吉特:什么';“这是最好的做法”;“git克隆”;到现有文件夹中?

吉特:什么';“这是最好的做法”;“git克隆”;到现有文件夹中?,git,Git,我有一个项目的工作副本,没有任何源代码管理元数据。现在,我想将git克隆到这个文件夹中,并保留我的本地更改 git clone不允许我克隆到现有文件夹中。这里的最佳做法是什么?我将git clone复制到一个新目录,并将现有目录的内容复制到新克隆 这可以通过克隆到新目录,然后将.git目录移动到现有目录中来实现 如果您现有的目录名为“code” 这也可以在执行clone命令时不进行签出;可以找到更多信息。有两种方法。在可能的情况下,我会先为你的新git工作目录创建一个干净的文件夹,然后在以后复制

我有一个项目的工作副本,没有任何源代码管理元数据。现在,我想将git克隆到这个文件夹中,并保留我的本地更改


git clone不允许我克隆到现有文件夹中。这里的最佳做法是什么?

我将
git clone
复制到一个新目录,并将现有目录的内容复制到新克隆

这可以通过克隆到新目录,然后将
.git
目录移动到现有目录中来实现

如果您现有的目录名为“code”


这也可以在执行clone命令时不进行签出;可以找到更多信息。

有两种方法。在可能的情况下,我会先为你的新git工作目录创建一个干净的文件夹,然后在以后复制你的版本。这可能看起来像*:

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
cd your_dir_to_clone_in/
git clone git@github.com/somerepo/ .
不管怎样,我要做的第一件事就是运行类似于
git stash
的程序,将所有本地更改的副本放在一边,然后您可以重新应用这些更改,并完成您想要提交的更改


*这两个示例都假设您从项目父目录中的shell开始。

不要克隆,取回。在回购协议中:

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...
你就像克隆人一样


这里有一个有趣的问题(也是一个没有答案的问题):如何找出裸树基于哪个提交,从而重置到哪个位置。

使用临时目录是可以的,但是如果您想避免该步骤,这将起作用。从工作目录的根目录:

$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft

如果您至少在使用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
    取消了
    --mirror
    选项的隐式
    bare=true
    ,从而允许存储库具有关联的工作目录并像普通克隆一样工作


如果要转换为工作副本的目录中已经存在
.git
元数据目录,则这显然不起作用。

我执行了以下操作,以签出现有目录中的主分支:

$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft

要将git repo克隆到空的现有目录中,请执行以下操作:

cd myfolder
git clone https://myrepo.com/git.git . 

请注意
git clone
命令末尾的
。这将把回购协议下载到当前的工作目录中。

按照OP要求的方式,已经有很多答案了。但值得注意的是,相反的做法要简单得多:

git clone repo-url tmp/
cp -R working/ tmp/

您现在有了所需的目标状态-新克隆+本地更改。

通常我会先克隆初始存储库,然后将现有文件夹中的所有内容移动到初始存储库。每次都有效

这种方法的优点是,您不会丢失初始存储库的任何内容,包括README或.gitignore

您还可以使用下面的命令完成以下步骤:

$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo

这是我遇到的所有方法中最好的

仅将存储库的.git文件夹(不包括文件,因为它们已经在
现有目录中)克隆到一个空的临时目录中

  • git clone--没有用于克隆现有目录的签出repo路径/existing dir.tmp
    //可能需要--没有用于克隆本地repo的硬链接
  • 将.git文件夹移动到包含这些文件的目录中。 这使得现有目录成为git回购

  • mv existing dir/existing dir.tmp/.git existing dir/
  • 删除临时目录

  • rmdir现有dir/existing dir.tmp

  • cd现有目录

  • Git认为所有文件都被删除了,这将使回购的状态恢复为HEAD

    警告:对文件的任何本地更改都将丢失

  • 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
    

    就用这个。在
    git clone
    命令的末尾(位于该目录中),如下所示:

    cd $dir
    git clone --no-checkout $url tempdir
    mv tempdir/.git .
    rmdir tempdir
    git reset --mixed HEAD
    
    cd your_dir_to_clone_in/
    git clone git@github.com/somerepo/ .
    

    如果要克隆同一存储库,请在现有存储库中运行以下代码段

    git pull origin master
    
    cd existing_repo
    git remote rename origin old-origin
    git remote add origin <url>
    git push -u origin --all
    git push -u origin --tags
    
    git init
    git远程添加源git@github.com:/.git
    git远程-v
    git拉源主机
    
    参考Gitlab命令行指令:

    推送现有文件夹

    cd existing_folder
    git init
    git remote add origin <url>
    git add .
    git commit -m "Initial commit"
    git push -u origin master
    
    cd-existing\u文件夹
    初始化
    git远程添加源
    git添加。
    git提交-m“初始提交”
    git-push-u源主机
    
    或者推送现有的Git存储库

    git pull origin master
    
    cd existing_repo
    git remote rename origin old-origin
    git remote add origin <url>
    git push -u origin --all
    git push -u origin --tags
    
    cd现有的\u回购
    git远程重命名原点旧原点
    git远程添加源
    git push-u原点——全部
    git push-u原点--标记
    
    如果您这样做,请确保在提交之前仔细检查差异-这是一个绝对经典的案例,在这种情况下,您可以意外地恢复源repo中所做的更改,因为无论何时您获得工作副本-因为工作副本中没有足够的信息来确定您所做的更改与开始之前的更改是什么样的进行变更,与回购协议中的其他变更合并。在这种情况下,我一次又一次地看到这种情况发生,以至于我“强烈劝阻”自己和同事不要这样做。
    gi