添加 submodule

假设当前 git 项目路径为 /home/lizs/app/project/

git submodule add submoduleUrl localPath
  • submoduleUrl:submodule 仓库路径,如:https://github.com/lizs/hello.git

  • 不指定 localPath,submodule clone 下来的项目会在当前目录,并且 submodule 的项目名就是 submodule 的根目录

    git submodule add https://github.com/lizs/hello.git
    

    submodule clone 下来的项目会在当前目录下,并且会用项目的名称作为submodule的根目录,也就是说,submodule的路径为 /home/lizs/app/project/hello

  • 如果添加 localPathlocalPath不能够是已经存在的目录。并且 submodule 会以 localPath 作为根目录。

    git submodule add https://github.com/lizs/hello.git www/
    

    submodule clone 下来的项目在当前目录下的 www 目录下,即 /home/lizs/app/project/www/

    git submodule add https://github.com/lizs/hello.git www/hi
    

    submodule clone 下来的项目在当前目录下的 www/hi 目录下,即 /home/lizs/app/project/www/hi

    localPath 不能够是已经存在的目录,是指路径的最后一层目录不能够已经存在。如果,localPathwww,即当前目录下不能够有 www 目录。如果 localPathwww/hi,即当前目录下可以有 www 目录(没有则会自动创建),但是 www 目录下不能够有 hi 目录。

  • 添加完成之后,会在当前项目跟路径下生成一个 .gitmodules 文件,其中记录了子模块的信息。


更新 submodule

进入 submodule 目录下,将更新内容推送到 submodule 的仓库即可。


删除 submodule

How do I remove a submodule?


克隆的项目中带有 submodule

git clone 下来的项目中带有 submodule 时,初始化的时候,submodule 的内容并不会自动下载下来。此时,只需执行:


git submodule update --init --recursive

error: RPC failed; result=18, HTTP code = 200bytes/s

当 git clone 一个项目下来的时候,发生错误


lizs@lizs-pc:~/app/we7$ git clone https://xxx@bitbucket.org/xxx/xxx.git Cloning into 'project_name'... Password for 'https://xxx@bitbucket.org': remote: Counting objects: 4168, done. remote: Compressing objects: 100% (3275/3275), done. error: RPC failed; result=18, HTTP code = 200bytes/s fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed

可能由于仓库文件比较大,而 curl 的 postBuffer 的值比较小的原因造成的。我们可以配置当前项目或者全局 postBuffer 的值的大小来解决这个问题。

设置当前项目的 postBuffer 属性:


git config http.postBuffer 524288000

设置 git 的 postBuffer 全局属性


git config --global http.postBuffer 524288000

Git pull:commit your changes or stash them before you can merge. Aborting

git pull 更新代码的时候,出现了这个错误,因为你本地做了修改,而且托管代码的服务器上也有新的提交。

解决方法

  • #### commit 本地代码

  • #### 将本地修改暂存到 Git 栈中

可以先通过 git stash 将本地修改暂存到 Git 的栈中,git pull 之后,再通过 git stash pop 来将之前本地做的修改应用到当前工作区。


git stash git pull git stash pop
  • `git stash`:备份当前工作区的内容,让工作区保持和上次提交的内容一致。同时,将当前工作区的内容保存到 Git 栈中。
    
  • `git stash pop`:从 Git 中读取最近一次保存的内容,恢复到工作区。由于可能存在多个 stash 的内容,所以用栈来管理,pop 会从最近的一个 stash 中读取内容并恢复。
    
  • `git stash list`:显示 Git 栈内的所有备份。
    
  • `git stash clear`:清空 Git 栈。
    
  • #### 放弃本地修改

git reset --hard git pull
  • git reset --hard:回滚到上次提交状态。

CRLF

CRLF:Carriage-Return Line-Feed 回车换行

CRLF:回车换行。

  • CR:回车,使用\r符号表示,ASCII 码为 13,十六进制代码为 0x0D;

  • LF:换行,使用\n符号表示,ASCII 码为 10,十六进制代码为 0x0A。

不同系统下的换行符
  • Windows/DOS:CR/LF

  • Unix/Linx:LF

  • Mac OS:CR

所以,Windows 系统上换行在文本文件中是使用 0d 0a 两个字节表示,而在 Unix/Linx或苹果系统上换行则是使用一个字节 0a 或 0d 表示。Unix/Linux/Mac系统下的文件在Windows里打开的话(使用Windows自带记事本),会出现换行丢失,所有文字会变成一行,整个文本会乱成一团。Windows系统下的文件在Unix/Linux/Mac里打开的话,在每行的结尾可能会多出一个^M符号。

Git CRLF

Git 在默认情况下,提交时会将 CRLF 转换为 LF,在拉取时将 LF 转换成 CRLF。我们可以通过设置 autocrlfsafecrlf 来处理 CRLF 的转换。

  • autocrlf 属性:trueinputfalse
    • true:提交时,CRLF 转换为 LF;拉取时,LF 转换为 CRLF

    • input:提交时,CRLF 转换为 LF;拉取时,不进行转换。

    • false:提交拉取时都不转换。

    • 查看当前项目的 autocrlf 属性:

    “`

git config core.autocrlf

```



+    查看 `autocrlf` 的全局属性:

```
</code></pre>

git config --global core.autocrlf

<pre><code>```



+    设置当前项目的 `autocrlf` 属性:

```
</code></pre>

git config core.autocrlf true/input/false

<pre><code>```



+    设置 `autocrlf` 的全局属性:

```
</code></pre>

git config --global core.autocrlf true/input/false

<pre><code>```
  • savecrlftruefalsewarn
    • 拒绝提交包含混合换行符的文件

    “`

  • </ul>

    <p>git config –global core.safecrlf true

    <pre><code>“`

    + 允许提交包含混合换行符的文件

    “`
    </code></pre>

    git config –global core.safecrlf false

    <pre><code>“`

    + 提交包含混合换行符的文件时给出警告

    “`
    </code></pre>

    git config –global core.safecrlf warn

    <pre><code>“`

推送到远程仓库

在本地开发环境开了个新项目,需要将项目推送到远程仓库(如,bitbucket)。

  • 首先,在本地创建一个 git 创库

$ git init $ git add -A $ git commit -am "xxx"
  • 创建远程仓库

  • 添加关联的远程仓库地址 git remote add origin URL,如:


$ git remote add origin https://lizsBitbucket.org/...
  • 推送到远程仓库

$ git push // 如果该分支为本地新建,而远程仓库没有的 $ git push --set-upstream origin branchName

迁移远程仓库

比如,在项目开发中想要将远程个人的私有仓库,迁移到一个公众账号的仓库中。

  • 远程仓库迁移

  • 本地仓库中更改 git 关联的远程 url 路径,git remote set-url origin URL


$ git remote set-url origin https://lizsBitbucket@bitbucket.org/...

https://... 为仓库的新地址。