我正在使用v3 API并设法列出repos/trees/branches,访问文件内容以及创建blob/trees/commit.我现在正在尝试创建一个新的repo,并设法用"POST user/repos"来做
但是当我尝试在这个新的repo中创建blob/trees/commits/references时,我得到了相同的错误消息.(409)"Git Repository是空的." 显然,我可以通过git命令行自己启动存储库,但是如果我的应用程序为我做了它,我宁愿这样做.
有没有办法做到这一点?在创建空存储库后,我需要通过API做的第一件事是什么?
谢谢
我正在尝试添加一个git预提交钩子,它将检查所有已更改的文件和新文件TODO:.
我试过了
#!/bin/sh
. git-sh-setup # for die
git-diff-index -p -M --cached HEAD -- | grep '^+' |
grep TODO: && die Blocking commit because string TODO: detected in patch
:
Run Code Online (Sandbox Code Playgroud)
我在类似的问题中看到了,但没有运气.
在GitPython中,我可以通过调用diff()不同提交对象之间的方法来单独迭代树中每个更改的diff信息.如果我diff()使用create_patch=True关键字参数调用,则会为每个我可以通过创建的diff对象访问的更改(添加,删除,重命名)创建补丁字符串,并剖析更改.
但是,我没有父级与第一次提交进行比较.
import git
from git.compat import defenc
repo = git.Repo("path_to_my_repo")
commits = list(repo.iter_commits('master'))
commits.reverse()
for i in commits:
if not i.parents:
# First commit, don't know what to do
continue
else:
# Has a parent
diff = i.diff(i.parents[0], create_patch=True)
for k in diff:
try:
# Get the patch message
msg = k.diff.decode(defenc)
print(msg)
except UnicodeDecodeError:
continue
Run Code Online (Sandbox Code Playgroud)
您可以使用该方法
diff = repo.git.diff_tree(i.hexsha, '--', root=True)
Run Code Online (Sandbox Code Playgroud)
但这会git diff使用给定的参数调用整个树,返回一个字符串,我无法分别获取每个文件的信息.
也许,有一种方法可以创建某种root对象.如何在存储库中获得第一个更改?
编辑
一个肮脏的解决方法似乎是通过直接使用 …
初学者的一个问题:git历史记录有多种搜索方式。对我来说,不清楚命令之间的区别到底是什么:
git log,例如git log -S 'for what you search' --all在所有分支中搜索字符串并
git log -G 'search for regexpr' --all搜索 regexpr。例如参见这里git log --grep 'pattern'git rev-list,例如git rev-list --grep='string' --allgit grep,例如git grep "string or regexpr" $(git rev-list --all)从这里gitk,例如gitk file.txtGUI 界面git log --all --full-history -- **/thefile.*从这里搜索历史记录中的文件名。git diff --word-diff-regex=. > changes.txt结合grep -oP '\+[^\+]+\+' changes.txt | tr -d '\+'显示基于字符的变化。从这里。如果尚未提交更改,这甚至可以工作。我的理解很差
git …无法理解子模块
它们似乎不必要地复杂。通常我完全避免它们,但一个项目迫使我陷入这种情况
所以...
我在我们的开发服务器上有一个带有子模块的 git repo
/myproject
/.git
/files ...
/other
/submodule
/.git
Run Code Online (Sandbox Code Playgroud)
现在因为我们运行一个开发/生产环境,我们可以做的事情非常有限
我如何能
我们传统上使用获取然后合并策略而不是单个拉取。由于团队规模很小,我们也不使用裸仓库。
我尝试了多种不同的方法来实现上述目标,但似乎都不对。似乎涉及很多步骤,所以我一定是做错了什么。
此外,我不希望从子模块远程存储库中获取到 prod 服务器的获取。
只是让您知道我正在从事的项目是一个 drupal 8 项目,在生产中进行开发是完全不合适的,我们甚至不安装 composer 或 drush。
我正在使用一个代码库,我需要为了不同的目的同时在多个分支上工作。所以我克隆到一个裸存储库,然后设置一些工作树:
git clone --bare ssh://git@git.example.com/project/repo repo.git
cd repo.git
git worktree add ../branch-1 branch-1
git worktree add ../branch-2 branch-2
... someone else creates branch-3 and pushes is ...
git fetch origin +refs/heads/*:refs/heads/* --prune
git worktree add ../branch-3 branch-3
Run Code Online (Sandbox Code Playgroud)
现在工作branch-3树没有设置为跟踪远程树并试图让它这样做,我陷入了可怕的混乱。
$ cd ../branch-3
$ git branch -u origin/branch-3
error: the requested upstream branch 'origin/refs/heads/feature/SW-5884-move-database-container-to-alpine-base-2' does not exist
hint: ...<snip>
$ git fetch +refs/heads/*:refs/remotes/origin/* --prune
$ git branch -u origin/branch-3
fatal: Cannot setup tracking information; starting point 'origin/feature/SW-5884-move-database-container-to-alpine-base-2' is not a …Run Code Online (Sandbox Code Playgroud) 假设我有一个 git 存储库,在某些分支上工作,并且在某些时候我不想签出任何分支。我可以这样做吗?
换句话说,我可以git clone path-to-repo --no-checkout在现有存储库上获得 , 但的效果吗?
编辑:实际上,如果主分支文件不显示为已删除,那就更好了。因此,理想的答案并不git clone像--no-checkout.
注意:如果您的建议需要最新版本的 git,请说明。
这将需要一位专家:
我运行了一个git init和git add --all一个我从事了很长时间的新项目,直到我意识到自己还没有设置git repot。运行git add之后,我意识到我忘记创建.gitignore文件。不假思索我就跑了git reset --hard HEAD,哦,我所有的文件都消失了,没有日志或reflog,没有状态,所有命令都生成了fatal: bad default revision 'HEAD'。我确定答案是我被搞砸了。似乎无法对任何悬垂的斑点执行任何操作。希望在那里找到一些上师知道我不知道的事情。
git fsck --full git:master
notice: HEAD points to an unborn branch (master)
Checking object directories: 100% (256/256), done.
notice: No default references
dangling blob c57eff55ebc0c54973903af5f72bac72762cf4f4
dangling blob 4740a6ee5099aa087bac317337e28bba78c4b83c
missing tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
dangling blob 0d6b3be3e5517a7a7df7df941a6bd3740fcfc5e1
dangling blob d0437745b1902b1ec7e4154a6c058a900575ae7b
dangling blob 5223f05f29bed36037a68f1185f0d718f2a5f9b8
dangling blob d3f186be7e3fcac86aa15c6ebf416f636269f356
dangling blob 526b432e210b3a943df9a7146a0fb4c3e30fc2f5
dangling blob 96722f502f9bd93e5205ea07d8c9b56b11f2e9bd
dangling blob 594eff1d8bfd71561f4f9a0b1447c764e812e2aa
dangling blob df1b87ad781e0a961648f2c01d37b9fe15e581bd
dangling blob e196d0eaf4df52ec1d65faf1971e444d37640284 …Run Code Online (Sandbox Code Playgroud) 例如我有这个提交历史记录
假设在某个时候release1发布到生产环境,几天后,release2分支发布了。
relase1包含从 master 精心挑选的 2 个提交(4 和 5)release2包含 2 个提交(8 和 9),也是从 master 中精心挑选的。择优挑选永远不会因为-x争论而结束。
我想要获得release2“当时尚未发布”的所有提交,这意味着由绿色圆圈标记的提交(6,7,8,9)。
做到这一点最简单的方法是什么?
github中的存储库示例
更新1(git樱桃)
$ git cherry -v release1 release2
- 91785f2be363244a1da4459746fce6a6ea28c2b5 4
- e88de1f8b62213089b300e3143c4caf509b5c13b 5
- 9d23e9c7e6f769c3bbb44ad42bc7b708b4b0a9e6 6
- 6fb71e4406e0b127e06f6e5b145de8a9d39db01e 7
- 6276becc413494b7724a4dd8b852234f4b71e913 8
- 6dd3b5b75222c02c921c9c20bcaee83e1c8be746 9
Run Code Online (Sandbox Code Playgroud)
有了cherry,似乎我仍然得到了 4 和 5,它们都是 form master
更新 2(--左-右--cherry-mark)
$ git log --left-right --cherry-mark --pretty=oneline --abbrev-commit release2...release1
= 6dd3b5b 9
= …Run Code Online (Sandbox Code Playgroud) 当您创建新存储库并运行时git branch,它将以静默方式退出.例如:
$ mkdir /tmp/foo; cd /tmp/foo; git init
Initialized empty Git repository in /tmp/foo/.git/
$ git branch
Run Code Online (Sandbox Code Playgroud)
为什么命令不提供任何输出,或显示主分支?
git ×9
git-branch ×2
github ×2
api ×1
checkout ×1
drupal-8 ×1
git-bare ×1
git-worktree ×1
github-api ×1
gitpython ×1
grep ×1
python ×1
recovery ×1
repository ×1
terminal ×1