在git中,是否可以创建一个存储库,将存储库推到远程存储库,在另一台计算机上检索存储库,并应用存储库?

或者我的选择是:

创建补丁并将补丁复制到另一台计算机,或者 创建一个小分支并将未完成的工作提交给该分支?


当前回答

我将混合上面的2个答案,只是为了分享我是如何用zsh shell来做的。

非常感谢@Scott Weldon和@sehe对这个问题的回答!我从他们身上学到了很多!!由于这个问题,我还广泛地学习了shell脚本编写!


一个关于代码功能的非常简单的解释

请参考以上的答案链接,以更好地(推荐)理解:

代码的作用:

Stash goes from Machine 1 --> to remote --> to Machine 2

机器1:

1. Push the stash to remote (using for loop for multiple stashes)

机器2:

1. Check stash(es) in remote. (This is just to check whether there are  previous stashes in remote. If there are, you must delete them if you don't want them in you stash list. Command for deleting remote stashes are given in bonus)
2. Fetch the stash(es) to a local ref folder named "ref/stashes" in your .git folder in your local repository. (Its like downloading the stashes on your PC)
3. Convert the fetched stash(es) to proper data. (Its like extracting or installing the stashes on your PC)

奖金:

1. Check stash(es) in remote
2. Delete stash(es) from remote 

代码:

在机器1上:

1. git push origin $(for sha in $(git rev-list -g stash); do echo $sha:"refs/stashes/$(git rev-parse --short $sha)"; done)

在机器2上:

1. git ls-remote
2. git fetch origin "refs/stashes/*":"refs/stashes/*"
3. for sha in $(git rev-list --no-walk --reverse --glob='refs/stashes/*'); do git stash store --message "$(git show --no-patch --format=format:%s $sha)" $sha; done

奖金:

1. git ls-remote
2. git push origin :refs/stashes/<stashFile-1> :refs/stashes/<stashFile-2>

以上代码用于多个存储,也可以用于一个存储。只需确保您的远程ref/stashes文件夹只有您在本地回购中想要的存储。

其他回答

我会选择第二种方法,尽管不知道为什么不能提交给main/feature分支。也有可能进行“樱桃挑选”。

这是不可能得到它通过fetch或这样,镜像refspec是fetch = +refs/*:refs/*,即使stash是refs/stash,它不会被发送。显式的refs/stash:refs/stash也没有效果!

这只会令人困惑,因为它不会获取所有的存储,只有最新的一个;存储列表是ref refs/stashes的reflog。

有点晚了,但这个答案可能会帮助到一些人。我之所以想知道这些,是因为我想在同一时间点在另一台电脑上发布正在开发的功能/bug/任何东西。

对我有效的是提交我正在进行的代码(在我独自处理的分支中)。当我到达另一台计算机时,执行拉取,然后撤销提交:

git reset --soft HEAD^

继续像以前那样工作,所有正在进行的更改都在那里,没有提交,也没有分期。

希望能有所帮助。

下面的代码不适用于隐藏,但适用于工作目录中未提交的更改。它创建一个分支,自动提交所有当前的更改,并推送到远程:

commit_and_push_ ( ) {
    # This will:
    #  1. checkout a new branch stash-XXX
    #  2. commit the current changes in that branch
    #  3. push the branch to the remote
    local locbr=${1:-autostash-XXX}
    git checkout -b $locbr
    git add .
    git commit -a -m "Automatically created commit"
    git push origin $locbr
    echo "Autocommitted changes in branch $locbr ..."
}

使用:

commit_and_push_ my-temp-branch
commit_and_push_

我有点晚了,但我相信我找到了一些适合我的东西,如果你的情况相同或相似,它可能也适用于你。

我在它自己的分支里做一个特性。分支不会合并到master中并推送,直到它完成或者我已经提交了我觉得可以向公众展示的内容。所以当我想要将非阶段性的更改转移到另一台计算机时,我所做的是:

Make a commit, with a commit message like "[non-commit] FOR TRANSFER ONLY", featuring the content you want transfered. Login to the other computer. Then do: git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb The URL might differ for you if you access your repository in a different way. This will pull changes from that URL from the remote branch "rb" into the local branch "lb". Note that I have an ssh server running on my own computer, and am able to access the repository that way. git reset HEAD^ (implies --mixed) This resets the HEAD to point to the state before the "[non-commit]" commit.

从git-reset (1): "——mixed:重置索引,但不重置工作树(即,更改的文件被保留,但不标记为提交)[…]"

因此,您最终将对文件进行更改,但不需要提交到master,也不需要存储。

然而,这将需要你git重置——在你做了“[非提交]”的存储库中硬HEAD^,因为那个提交是垃圾。