![Git 从另一台电脑推送更改后没有将更改推送到 github](https://linux22.com/image/1464899/Git%20%E4%BB%8E%E5%8F%A6%E4%B8%80%E5%8F%B0%E7%94%B5%E8%84%91%E6%8E%A8%E9%80%81%E6%9B%B4%E6%94%B9%E5%90%8E%E6%B2%A1%E6%9C%89%E5%B0%86%E6%9B%B4%E6%94%B9%E6%8E%A8%E9%80%81%E5%88%B0%20github.png)
我有以下有关 Git 的设置:
- 运行 Arch Linux 和默认 Git 客户端的小型服务器。我使用此设置自动更改某些文件,然后将这些更改推送到我的 Github 存储库。
- 我的 Windows 8.1 PC 安装了 SmartGit。我偶尔会对文件进行更改,然后手动将其推送到我的 Github 存储库。
我遇到的问题是,当我对 Windows PC 上的文件进行一些更改,然后推送这些更改时,我的 Arch Linux 服务器显然失去了将其更改推送到远程存储库的能力。Arch Linux 客户端能够毫无问题地推送其自动更改,直到我使用 Windows PC 推送某些内容。发生这种情况后,就会出现问题。我发现解决此问题的唯一方法是删除 Arch Linux 服务器上的本地存储库,然后通过从远程提取来创建一个新的本地存储库。
我编写了 Arch Linux 客户端脚本,以便在进行任何更改之前从远程存储库中提取和获取数据,并且当我在我的 PC 上进行更改时也执行相同的操作。
有人能帮我找出为什么会发生这种情况吗?我该怎么做才能防止这个问题再次发生?非常感谢您的帮助。
以下是我在 Arch Linux 服务器上使用的脚本:
主要脚本:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
# Test if an internet connection is present
ping -c 3 google.com > /dev/null 2> /dev/null
if [ $? != 0 ]; then
exit 1
fi
# Git requires that the working directory be the repository I am working with
cd /home/git-user/repositories/xjdhdr-random-code
# Update local repository to ensure no conflicts exist before I make changes
/home/git-user/bin/expect-gitpull.sh
# snip: Everything between these two commands basically make a lot of changes to a lot of text files. Probably has nothing to do with Git or my problem.
# Commit changes to remote repository.
cd /home/git-user/repositories/xjdhdr-random-code
git add -A -f --ignore-errors --
git commit -m "Automatic commit of machine generated changes to repository" --no-edit --
/home/git-user/bin/expect-gitpush.sh
exit 0
/home/git-user/bin/expect-gitpull.sh
#!/bin/expect
set password {*don't need anyone to see my passphrase*}
cd /home/git-user/repositories/xjdhdr-random-code
spawn git pull origin
expect "Enter passphrase for key '/home/git-user/.ssh/id_rsa':"
send -- "$password\r"
send -- "\r"
expect "%PROMPT%"
spawn git fetch -p origin
expect "Enter passphrase for key '/home/git-user/.ssh/id_rsa':"
send -- "$password\r"
send -- "\r"
expect "%PROMPT%"
/home/git-用户/bin/expect-gitpush.sh
#!/bin/expect
set password {*ditto*}
cd /home/git-user/repositories/xjdhdr-random-code
spawn git push --recurse-submodules=check
expect "Enter passphrase for key '/home/git-user/.ssh/id_rsa':"
send -- "$password\r"
send -- "\r"
expect "%PROMPT%"
答案1
我搞清楚了问题所在。默认情况下,expect 设置为,如果要求它们等待的字符串没有出现,则任何 Expect 命令都会在 10 秒后超时。在我的例子中,预期“%PROMPT%”在“git push”命令运行时超时。由于之后没有其他命令,因此脚本被终止。这意味着推送无法成功完成。
解决方案是添加设置超时X在脚本顶部附近,将 X 替换为您希望等待的秒数(如果您希望它无限期等待,则使用 -1)。