2

在工作中,开发使用 perforce 来处理代码共享。我不会说“修订控制”,因为我们不允许签入更改,直到它们准备好进行回归测试。为了让我的个人变更集处于修订控制之下,我已获准构建自己的 git 并将 perforce depot 的客户端视图初始化为 git repo。

然而,这样做有一些困难。

  1. 客户端视图位于~, ( ~/p4) 的子文件夹中,我也希望对其~进行修订控制,并具有自己的单独历史记录。我不知道如何在不使用子模块的情况下将历史记录~分开。~/p4子模块的问题在于,看起来我必须创建一个将成为子模块的存储库,然后git submodule add <repo> <path>. 但是除了在~. 似乎没有安全的地方可以使用 git p4 clone 创建软件仓库的初始客户端视图。

    (我正在假设不支持将 repo 初始化或克隆到 git repo 的子目录中。至少,我在嵌套的 git repos 上找不到任何权威。)

    编辑:仅仅是忽略~/p4回购的根源就~足以让我在其中初始化一个嵌套回购~/p4吗?当我访问 git repo 的一个被忽略的子目录时,我的 __git_ps1 函数仍然认为我在一个 git 存储库中,所以我倾向于不这么认为。

  2. 我需要将 git p4 sync 创建的“远程”存储库作为 ~/p4 中的一个分支。我们需要将所有代码保存在 ~/p4 中,这样它就不会被备份。我可以从真正是本地分支的“远程”分支中提取吗?

  3. 这只是为了方便,但我认为我可以通过询问来学习一些东西。对于 99% 的项目,我只想以 p4 头版本作为初始提交对象开始。对于另外 1%,我想把整个 p4 历史记录下来,以便我可以在 git 中浏览它。IOW,在我完成初始化后, remotes/p4/master 分支的初始提交将包含:

    revision 1 of //depot/prod/Foo/Bar/*
    revision X of other files in //depot/prod/*, where X is the head revision
    

    并且该remotes/p4/master分支包含 Y 个提交,其中 Y 是在 中包含文件的更改列表的数量,//depot/prod/Foo/Bar/*历史中的每个提交对应于这些 p4 更改列表之一,并且 HEAD 看起来像 p4 的头部。

编辑:meagar 的回答对我不太适用。

我已经初始化 ~ 并签入了一些提交。我忽略了 ~/p4 并且 ~/p4 不在任何提交对象中。=:

[~@ernie02] (master) $ git show HEAD:p4
fatal: Path 'p4' exists on disk, but not in 'HEAD'.

然后我去了 ~/p4/prod,一个我想签出的分支。但是这个 repo 坏了:

[~/p4/prod@ernie02] (master) $ git log
(shows the log for the repo rooted at ~)
[~/p4/prod@ernie02] (master) $ git init
Initialized empty Git repository in ~/p4/prod/.git/
[~/p4/prod@ernie02] (master) $ git log
fatal: bad default revision 'HEAD'

编辑编辑:糟糕,我忘了向~/p4/prod. 我现在正在尝试 git p4 sync //depot/prod...

4

1 回答 1

2

In answer to #1, if you really want to have your whole home directory in a git repository, but have ~/p4 in a seperate repository, just add "p4" to .git_ignore in your home directory, and make another repo in p4:

$ cd ~
$ git init
$ echo "p4" > .git_ignore
$ git add .git_ignore
# add all files/directories except p4
$ git commit
$ cd p4
$ git init
$ git add .
$ git commit

I don't quite follow #2, but yes, you can pull from a "remote" repo that is local to your file system. As far as "pulling" from local branches, that isn't pulling; pulling involves a fetch and a merge. If you omit the fetch, it's just a merge, so you're really talking about merging from a local branch.

于 2010-04-27T16:35:42.157 回答