git bundle create

git bundle create

我想使用版本控制,但出于安全原因,我使用的服务器无法访问互联网:我只能移动 USB 闪存驱动器上的文件。我还能使用此设置使用 Git 吗?我可以创建可应用于 Git 存储库的小补丁吗?

答案1

当然,Git 不需要任何特定的协议。开箱即用标准客户端支持HTTP(S)、SSH、自定义 Git 协议,以及最重要的当地的协议。这只需要一个本地目录的路径.git,该路径可以在工作目录 ( /path/to/project/.git) 内,也可以只是一个裸目录 ( /path/to/project.git),尽管命名只是一种惯例。

这意味着您当然可以将闪存驱动器添加为遥控器:

git remote add origin /mnt/flashdrive/foo.git

或者,在 Windows 上:

git remote add origin F:\foo.git

或者甚至可以将其添加为具有不同名称的附加遥控器(如果您希望origin指向某处的 Internet 服务器):

git remote add flashdrive /mnt/flashdrive/foo.git

然后,您就可以像任何其他遥控器一样向/从该遥控器进行推送/拉取。

如果你读过文档,您会注意到还有一个file://协议的行为略有不同。建议使用本地路径,因为这将利用一些额外的优化 - 如果您使用该file://协议,则 git 将使用一些标准网络组件(与本地磁盘通信),这会比较慢。

答案2

单身的计算机,无需任何特殊操作。git init在所需目录中运行并像平常一样使用 Git。

用于跨多种的计算机,有几种方法。

方法 1a(完全没有网络):您可以在 USB 上创建一个“裸存储库”,然后像任何其他远程存储库一样向其中推送和从中拉取。换句话说,通过本地路径进行的存储库操作与通过 SSH 或 HTTPS URL 进行的操作没有任何不同。

  1. 创建一个“远程”存储库:

    $ git init --bare /mnt/Stick/Repositories/Large_Project.git
    
  2. 在计算机 1 中,将所有内容推送到它:

    $ cd ~/Large_Project
    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git push usb master
    
  3. 在计算机 2 中,嗯,和往常一样。

    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git pull usb
    

(您也可以直接从 URL 或路径推送/获取/拉取。)

方法1b(内部网络):如果你有一个可以使用 SSH 的内部服务器,并且安装了 Git,则可以执行同上,只需使用[user@]host:pathssh://[user@]host/path语法指定一个 SSH 地址。

  1. git init --bare <somepath.git>通过在指定服务器上运行(通过 SSH)创建“远程”存储库。

  2. 在计算机 1 中,方法与之前演示的相同。

    $ git remote add origin myserver.example.com:Gits/Large_Project.git
    

    或者如果你愿意:

    $ git remote add origin ssh://myserver.example.com/~/Gits/Large_Project.git
    
  3. 在计算机 2 中,同样与方法 1a 相同。


方法 2:您可以创建“传输包”,将给定的提交列表存档到单个文件中。

不幸的是,bundle 命令不会自动记住上次已经打包的内容,因此需要手动标记或记笔记。我将仅从 git-bundle 手册中获取示例。

  1. 在计算机 1 中,创建整个分支的捆绑:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle master
    $ git tag -f last-bundled master
    
  2. 在计算机 2 中,从捆绑包中提取数据,就像它是存储库一样:

    $ cd ~/Large_Project
    $ git pull /mnt/Stick/Project.bundle
    

后续的捆绑包不需要打包全部内容master– 它们可以只打包新添加的提交last-bundled..master

  1. 在计算机 1 中,创建新添加的提交的捆绑包:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle last-bundled..master
    $ git tag -f last-bundled master
    
  2. 同上。

答案3

git bundle create

其中一种方法是使用外部存储在存储库之间交换数据git 捆绑。这样,每次传输就只有单个文件,而不是中间 Git 存储库。

每次“git push”都会创建一个文件,“git fetch”会从该文件中获取内容。

演示会话

创建第一个存储库并执行第一次“推送”

gitbundletest$ mkdir repo1

gitbundletest$ cd repo1

repo1$ git init
Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/
repo1$ echo 1 > 1 && git add 1 && git commit -m 1
[master (root-commit) c8b9ff9] 1
 1 file changed, 1 insertion(+)
 create mode 100644 1

repo1$ git bundle create /tmp/1.bundle master HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

“克隆”到第二个存储库(即第二台计算机):

gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.

gitbundletest$ cd repo2/

repo2$ cat 1
1

进行一些更改并将它们“推送”到另一个捆绑文件中:

repo2$ echo 2 > 1 && git add 1 && git commit -m 2
[master 250d387] 2
 1 file changed, 1 insertion(+), 1 deletion(-)

repo2$ git bundle create /tmp/2.bundle origin/master..master origin/HEAD..HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

将更改“拉”到第一个存储库:

repo2$ cd ../repo1

repo1$ git pull /tmp/2.bundle 
Receiving objects: 100% (3/3), done.
From /tmp/2.bundle
 * branch            HEAD       -> FETCH_HEAD
Updating c8b9ff9..250d387
Fast-forward
 1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

repo1$ cat 1
2

与第一个包不同,第二个包仅包含部分 Git 历史记录,并且不能直接克隆:

repo1$ cd ..

gitbundletest$ git clone /tmp/2.bundle repo3
Cloning into 'repo3'...
error: Repository lacks these prerequisite commits:
error: c8b9ff94942039469fa1937f6d38d85e0e39893a 
fatal: bad object 250d38747656401e15eca289a27024c61e63ed68
fatal: remote did not send all necessary objects

使用 bundles 的缺点是,您需要手动指定每个 bundles 应包含的提交范围。与 不同git pushgit bundle它不会跟踪上一个 bundles 中的内容,您需要手动调整refs/remotes/origin/master,否则 bundles 会比它应该的更大。

答案4

您也可以在本地使用 Git。这样,您的提交仅存储在本地,并且您仍然可以对其进行版本控制(并且可以进行差异/合并等),但您无法从任何其他计算机访问存储库。

git init您可以通过在本地文件夹中运行来启动本地 Git 存储库。如此处所述

相关内容