git:为空项目推送一个新的空分支



我在远程上有一个空项目,我克隆了它。现在我想开始处理一个分支,testdev并开始处理它,而无需掌握任何代码。

$ git checkout -b testdev
$ git status
On branch testdev
Initial commit
nothing to commit (create/copy files and use "git add" to track)

现在我尝试将此分支推送到位桶

$ git push origin testdev
error: src refspec testdev does not match any.
error: failed to push some refs to 'https://username@bitbucket.org/myremoterepo.git'

我尝试了git add .git commit -m "msg"但这毫无用处,因为我没有任何文件可以跟踪或提交。那么如何将空分支推送到空项目呢?

如果你的 repo 仍然是空的,你可以尝试创建一个空的提交,以便推送一些东西

git commit --allow-empty -m "initial commit"
git push -u origin testdev

另请参阅"为什么需要显式推送新分支?

<小时 />

Git 2.35(2022 年第 1 季度(允许读取有关为任意存储库定义的远程数据库的信息。

请参阅提交 4a2dcb1、提交 56eed34、提交 085b98f、提交 fd3cb05、提交 e083ef5(2021 年 11 月 17 日(,作者:Glen Choo ( chooglen (.
(由 Junio C Hamano -- gitster -- 合并于 2021 年 12 月 10 日 提交 6d1e149(

remote:如果在存储库中找不到分支,则死亡

签名者:Glen Choo
审稿人: 谭咏麟

在随后的提交中,我们希望面向外部的函数能够接受"结构存储库"和"结构分支"作为一对.
这对于像 pushremote_for_branch() 这样的函数很有用,这些函数需要从remote_state和分支中获取值,即使分支 == NULL .
但是,调用方可能会提供不相关的存储库和分支,这是不支持的行为。

为了防止误用,请添加一个 die_on_missing_branch() 帮助程序函数,如果给定分支不是来自给定存储库,则该函数将失效。
通过将分支列表替换为branches_hash哈希图来加快存在检查速度。

read_config()一样,die_on_missing_branch()只从非静态函数调用;静态函数不太容易被误用,因为它们有很强的约定来保持remote_state和分支同步。

<小时 />

在 Git 2.37(2022 年第 3 季度(中,配置错误的"branch..remote"导致配置解析错误。

它避免了branch was not found in the repository.

请参阅提交 f1dfbd9,提交 91e2e8f (2022 年 5 月 31 日(,作者:Glen Choo ( chooglen (.
(由 Junio C Hamano 合并 -- gitster -- 在提交 0b91d56, 10 Jun 2022

(

remote.c:不要在 0 长度的分支名称上 BUG((

报告人:"Ing. Martin Prantl Ph.D.">
帮助: Jeff King
签名:Glen Choo

4a2dcb1("remote:如果在存储库中找不到分支,则死亡",2021-11-17,Git v2.35.0-rc0 -- 合并列在批处理 #2 中(引入了一种回归,其中多个具有空分支名称的配置条目,例如

[branch ""]
    remote = foo
    merge = bar

可能导致 Git 在尝试查找分支跟踪信息时失败。

我们

解析配置键来获取(分支名称,分支名称长度(,但是当分支名称子节为空时,我们得到一个虚假的分支名称,例如" branch..remote "给出(".remote", 0).
我们继续使用虚假的分支名称,就好像它是有效的一样,在 4a2dcb1 之前,这不是问题,因为 length = 0 导致分支名称有效地""到处。

但是,当我们创建分支时,该提交处理length = 0不一致:

  • 当调用 find_branch() 以检查分支哈希映射中是否存在分支时,它将长度 0 解释为表示它应该在 char 指针上调用strlen
  • 但是插入分支哈希映射的代码路径将长度 0 解释为字符串长度为 0。

这会导致上述错误:

    "
  • branch..remote " 在分支哈希映射中查找 ".remote".
    由于我们找不到它,我们将""条目插入哈希映射中。
  • "
  • branch..merge" 在分支哈希映射中查找 ".merge".
    由于我们没有找到它,我们再次尝试将""条目插入哈希映射.
    但是,分支哈希映射中的条目应该追加到,而不是覆盖。
  • 由于覆盖条目是一个 BUG((,Git 会失败,而不是静默地忽略空分支名称。

通过删除便利strlen功能来修复错误,以便 0 表示字符串长度为 0。

<小时 />

在 Git 2.37(2022 年第 3 季度(中,修复git remote释放后使用(另一个忘记释放(修复。

请参阅提交 323822c,提交 338959d (07 Jun 2022( 由 Ævar Arnfjörð Bjarmason ( avar (.
(由 Junio C Hamano -- gitster -- 合并于 提交 fe66167,2022 年 6 月 13 日(

remote.c:不要在释放循环中取消引用 NULL

签名者:埃瓦尔·阿恩菲约泽·比亚梅森

修复了 fd3cb05 中的一个错误("remote:将静态变量移动到每个存储库结构中",2021-11-17,Git v2.35.0-rc0 - 合并在批处理 #2 中列出(,free(remote->pushurl[i])我们在NULL remote->pushurl .
本身.
我们在下一个"for"循环中释放" remote->pushurl",所以这样做似乎是一个复制/粘贴错误。

在此更改之前,GCC 12 的-fanalyzer会正确注意到我们将取消引用NULL在这种情况下,此更改修复了以下内容:

remote.c: In function ‘remote_clear’:
remote.c:153:17: error: dereference of NULL ‘*remote.pushurl’ [CWE-476] [-Werror=analyzer-null-dereference]
  153 |                 free((char *)remote->pushurl[i]);
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      [...]

最新更新