了解git init

时间:2012-11-23 08:51:05

标签: git

究竟是什么git init?我必须每台计算机执行一次,或者每个使用git的项目执行一次吗?我通过git clone下载了我的项目并使其正常工作,但现在它也将我的项目存储到C:/Users/myUser/git,是某个文件夹还是我可以更改它?

我对该文件夹并不是很了解,它看起来像是一个本地git仓库或其他什么东西,但是“管理”它的原因,或者它为什么使用这条路径,你能解释一下吗?

这是我理解的,如果我不正确,请修理我,需要直接了解事实:

  1. git init适用于每个项目
  2. “用户”下的git文件夹是本地仓库,每次我git commit时,该文件夹都会更新。
  3. 当我执行git push时,它需要从该本地仓库获取,然后放入远程存储库。
  4. 当我想更新为“HEAD”时,我只是git pull

5 个答案:

答案 0 :(得分:36)

这实际上是很多问题和误解。我不确定我是否能够解决这些问题所以我只会解决直接问到的问题。

  1. git init适用于每个项目

    几乎正确。 git init用于开始在不在git下的项目上使用git。对于已经在git下的项目,您使用git clone

  2. “用户”下的git文件夹是本地回购

    几乎正确。该文件夹实际上是.git而不是git。这来自unix约定,所有以点开头的文件和文件夹都被视为隐藏。

    其次,该文件夹不在“用户”文件夹下。它位于您的项目文件夹下。因此文件夹C:/Users/myUser/是一个项目。如果这不是您的意图,那么您很可能在用户文件夹中意外执行了git init

    每个项目在项目的根目录中都有一个.git文件夹,这是项目的存储库。这是git与svn或cvs相比如此之快的原因之一 - 整个存储库在本地硬盘上处理而没有任何网络流量。

  3. 当我执行git push时,它需要来自本地仓库,然后放入远程

    正确,但仅适用于具有遥控器的存储库(通常是使用git clone复制远程存储库创建的存储库)。

    请注意,远程仓库不需要在另一台计算机上。您可以将项目从本地文件夹git克隆到另一个文件夹,然后将更改从新文件夹推回到原始文件夹。

    git clone命令会自动为您的仓库设置必要的配置以连接回远程。但您也可以手动配置使用git init设置的仓库以连接到遥控器。

  4. “管理”它

    .git文件夹管理您项目的回购。 Git不作为服务器运行*。相反,.git文件夹充当所有git命令与之通信的本地“服务器”。基本上,运行git命令会编辑.git文件夹的内容。

    *注意:远程回购会运行服务器,以便您可以连接它们。但从技术上讲,他们并不是真正的 git 服务器。它们是git可以下载并上传到的文件服务器。

答案 1 :(得分:3)

你的三个四个理解或多或少是正确的,尽管你遗漏了一些细节。

git init初始化(即创建)存储库。每个项目都应该在自己的存储库中。

如果您使用git clone下载了项目,则无需再次运行git init

您应该能够将项目复制到另一个目录而不会产生任何不利影响。该路径可能是默认选择的。务必移动整个目录。 git需要运行的元数据存储在项目目录中的隐藏文件中。

推送和拉动可能会变得复杂,特别是当您与他人合作时,以及当您使用分支机构时。在这里写一篇关于这个主题的完整介绍对我来说真的不明智,所以我建议你去阅读Pro Git以获得更全面的解释。

答案 2 :(得分:2)

git init仅适用于从头开始创建自己的新存储库的情况。它将目录转换为空的git存储库。

当您使用git clone将现有存储库克隆到新存储库时,git init既不必要也不需要。

答案 3 :(得分:0)

@Jaanus是@slebetman对git pull所作解释的补充。它不是完全同步,而是获取不在本地的提交。这更多的是极端情况,请考虑以下问题-

  1. 假定要处理一个分支test_branch。对于origin/test_branch(git服务器上的分支),存在A,B和C提交,其中C是最近的提交。您已经拉了一下,现在本地分支上也有A,B和C。

  2. 比方说,由于某种原因,您不得不重置提交B并强制重写origin/test_branch的历史记录,而将历史记录保留为A和C。

  3. 现在当您在本地执行git pull时。它会说everything already up to date,但是请注意您还有提交B的其他更改。因此,请勿将其视为同步操作,而应将其更多地视为get what I don't have操作。

希望是有帮助的。

答案 4 :(得分:-1)

#!bin/bash
DATE=`date +%m%d%Y.%H%M%S`
TARGET="$1.$DATE"
DIR=`pwd`


function batch_convert() {
for file in `ls $1`
do
if [ -d $1"/"$file ]
then
batch_convert $1"/"$file
else
dos2unix $1"/"$file
#echo $1"/"$file
fi
done
}

##################

echo $TARGET
cd $DIR/DCW
git pull
cd ../
batch_convert DCW
cp -R DCW tmp/$TARGET
cd tmp/$TARGET
find . -type d -name "*git*"| xargs -n20 rm -rf



for db in `cat $DIR/tmp/$TARGET/Dblist` ; do
        echo "********** DB IS $db *******"
       for dbfolder in `find * -maxdepth 0 -type d` ;do
    echo `ls -a`
        echo "***** DBFolder is  $dbfolder *****"
    if [ ! $dbfolder = $db ];then
    cp -R $dbfolder $db
    find $db -name "*.ctl"| xargs -I '{}' mv '{}' $db/${db}.ctl
    fi
    done
done
cd ../
tar -cf $TARGET.tar $TARGET