Allow configuring pull behaviour (#1276)
This commit is contained in:
parent
8bd156dea6
commit
1e9e5686af
17 changed files with 79 additions and 25 deletions
|
@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- On Android 11, Autofill will use the new [inline autofill](https://developer.android.com/guide/topics/text/ime-autofill#configure-provider) UI that integrates Autofill results into your keyboard app.
|
- On Android 11, Autofill will use the new [inline autofill](https://developer.android.com/guide/topics/text/ime-autofill#configure-provider) UI that integrates Autofill results into your keyboard app.
|
||||||
- Invalid `.gpg-id` files can now be fixed automatically by deleting them and then trying to create a new password.
|
- Invalid `.gpg-id` files can now be fixed automatically by deleting them and then trying to create a new password.
|
||||||
- Suggest users to re-clone repository when it is deemed to be broken
|
- Suggest users to re-clone repository when it is deemed to be broken
|
||||||
|
- Allow doing a merge instead of a rebase when pulling or syncing
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
|
|
@ -66,9 +66,9 @@ abstract class BaseGitActivity : ContinuationContainerActivity() {
|
||||||
}
|
}
|
||||||
val op = when (operation) {
|
val op = when (operation) {
|
||||||
GitOp.CLONE -> CloneOperation(this, GitSettings.url!!)
|
GitOp.CLONE -> CloneOperation(this, GitSettings.url!!)
|
||||||
GitOp.PULL -> PullOperation(this)
|
GitOp.PULL -> PullOperation(this, GitSettings.rebaseOnPull)
|
||||||
GitOp.PUSH -> PushOperation(this)
|
GitOp.PUSH -> PushOperation(this)
|
||||||
GitOp.SYNC -> SyncOperation(this)
|
GitOp.SYNC -> SyncOperation(this, GitSettings.rebaseOnPull)
|
||||||
GitOp.BREAK_OUT_OF_DETACHED -> BreakOutOfDetached(this)
|
GitOp.BREAK_OUT_OF_DETACHED -> BreakOutOfDetached(this)
|
||||||
GitOp.RESET -> ResetToRemoteOperation(this)
|
GitOp.RESET -> ResetToRemoteOperation(this)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import dev.msfjarvis.aps.util.extensions.viewBinding
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.eclipse.jgit.lib.Constants
|
import org.eclipse.jgit.lib.Constants
|
||||||
import org.eclipse.jgit.lib.Repository
|
import org.eclipse.jgit.lib.Repository
|
||||||
|
import org.eclipse.jgit.lib.RepositoryState
|
||||||
|
|
||||||
class GitConfigActivity : BaseGitActivity() {
|
class GitConfigActivity : BaseGitActivity() {
|
||||||
|
|
||||||
|
@ -79,10 +80,10 @@ class GitConfigActivity : BaseGitActivity() {
|
||||||
val repo = PasswordRepository.getRepository(null)
|
val repo = PasswordRepository.getRepository(null)
|
||||||
if (repo != null) {
|
if (repo != null) {
|
||||||
binding.gitHeadStatus.text = headStatusMsg(repo)
|
binding.gitHeadStatus.text = headStatusMsg(repo)
|
||||||
// enable the abort button only if we're rebasing
|
// enable the abort button only if we're rebasing or merging
|
||||||
val isRebasing = repo.repositoryState.isRebasing
|
val needsAbort = repo.repositoryState.isRebasing || repo.repositoryState == RepositoryState.MERGING
|
||||||
binding.gitAbortRebase.isEnabled = isRebasing
|
binding.gitAbortRebase.isEnabled = needsAbort
|
||||||
binding.gitAbortRebase.alpha = if (isRebasing) 1.0f else 0.5f
|
binding.gitAbortRebase.alpha = if (needsAbort) 1.0f else 0.5f
|
||||||
}
|
}
|
||||||
binding.gitLog.setOnClickListener {
|
binding.gitLog.setOnClickListener {
|
||||||
runCatching {
|
runCatching {
|
||||||
|
|
|
@ -56,6 +56,12 @@ class RepositorySettings(private val activity: FragmentActivity) : SettingsProvi
|
||||||
|
|
||||||
override fun provideSettings(builder: PreferenceScreen.Builder) {
|
override fun provideSettings(builder: PreferenceScreen.Builder) {
|
||||||
builder.apply {
|
builder.apply {
|
||||||
|
checkBox(PreferenceKeys.REBASE_ON_PULL) {
|
||||||
|
titleRes = R.string.pref_rebase_on_pull_title
|
||||||
|
summaryRes = R.string.pref_rebase_on_pull_summary
|
||||||
|
summaryOnRes = R.string.pref_rebase_on_pull_summary_on
|
||||||
|
defaultValue = true
|
||||||
|
}
|
||||||
pref(PreferenceKeys.GIT_SERVER_INFO) {
|
pref(PreferenceKeys.GIT_SERVER_INFO) {
|
||||||
titleRes = R.string.pref_edit_git_server_settings
|
titleRes = R.string.pref_edit_git_server_settings
|
||||||
visible = PasswordRepository.isGitRepo()
|
visible = PasswordRepository.isGitRepo()
|
||||||
|
|
|
@ -28,7 +28,8 @@ sealed class GitException(@StringRes res: Int, vararg fmt: String) : Exception(b
|
||||||
*/
|
*/
|
||||||
sealed class PullException(@StringRes res: Int, vararg fmt: String) : GitException(res, *fmt) {
|
sealed class PullException(@StringRes res: Int, vararg fmt: String) : GitException(res, *fmt) {
|
||||||
|
|
||||||
object PullRebaseFailed : PullException(R.string.git_pull_fail_error)
|
object PullRebaseFailed : PullException(R.string.git_pull_rebase_fail_error)
|
||||||
|
object PullMergeFailed : PullException(R.string.git_pull_merge_fail_error)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -21,7 +21,6 @@ import kotlinx.coroutines.withContext
|
||||||
import org.eclipse.jgit.api.CommitCommand
|
import org.eclipse.jgit.api.CommitCommand
|
||||||
import org.eclipse.jgit.api.PullCommand
|
import org.eclipse.jgit.api.PullCommand
|
||||||
import org.eclipse.jgit.api.PushCommand
|
import org.eclipse.jgit.api.PushCommand
|
||||||
import org.eclipse.jgit.api.RebaseResult
|
|
||||||
import org.eclipse.jgit.api.StatusCommand
|
import org.eclipse.jgit.api.StatusCommand
|
||||||
import org.eclipse.jgit.lib.PersonIdent
|
import org.eclipse.jgit.lib.PersonIdent
|
||||||
import org.eclipse.jgit.transport.RemoteRefUpdate
|
import org.eclipse.jgit.transport.RemoteRefUpdate
|
||||||
|
@ -62,9 +61,14 @@ class GitCommandExecutor(
|
||||||
val result = withContext(Dispatchers.IO) {
|
val result = withContext(Dispatchers.IO) {
|
||||||
command.call()
|
command.call()
|
||||||
}
|
}
|
||||||
val rr = result.rebaseResult
|
if (result.rebaseResult != null) {
|
||||||
if (rr.status == RebaseResult.Status.STOPPED) {
|
if (!result.rebaseResult.status.isSuccessful) {
|
||||||
throw PullException.PullRebaseFailed
|
throw PullException.PullRebaseFailed
|
||||||
|
}
|
||||||
|
} else if (result.mergeResult != null) {
|
||||||
|
if (!result.mergeResult.mergeStatus.isSuccessful) {
|
||||||
|
throw PullException.PullMergeFailed
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is PushCommand -> {
|
is PushCommand -> {
|
||||||
|
|
|
@ -8,12 +8,13 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import dev.msfjarvis.aps.R
|
import dev.msfjarvis.aps.R
|
||||||
import dev.msfjarvis.aps.util.git.sshj.ContinuationContainerActivity
|
import dev.msfjarvis.aps.util.git.sshj.ContinuationContainerActivity
|
||||||
import org.eclipse.jgit.api.RebaseCommand
|
import org.eclipse.jgit.api.RebaseCommand
|
||||||
|
import org.eclipse.jgit.api.ResetCommand
|
||||||
|
import org.eclipse.jgit.lib.RepositoryState
|
||||||
|
|
||||||
class BreakOutOfDetached(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) {
|
class BreakOutOfDetached(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) {
|
||||||
|
|
||||||
override val commands = arrayOf(
|
private val merging = repository.repositoryState == RepositoryState.MERGING
|
||||||
// abort the rebase
|
private val resetCommands = arrayOf(
|
||||||
git.rebase().setOperation(RebaseCommand.Operation.ABORT),
|
|
||||||
// git checkout -b conflict-branch
|
// git checkout -b conflict-branch
|
||||||
git.checkout().setCreateBranch(true).setName("conflicting-$remoteBranch-${System.currentTimeMillis()}"),
|
git.checkout().setCreateBranch(true).setName("conflicting-$remoteBranch-${System.currentTimeMillis()}"),
|
||||||
// push the changes
|
// push the changes
|
||||||
|
@ -22,7 +23,26 @@ class BreakOutOfDetached(callingActivity: ContinuationContainerActivity) : GitOp
|
||||||
git.checkout().setName(remoteBranch),
|
git.checkout().setName(remoteBranch),
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun preExecute() = if (!git.repository.repositoryState.isRebasing) {
|
override val commands by lazy(LazyThreadSafetyMode.NONE) {
|
||||||
|
if (merging) {
|
||||||
|
// We need to run some non-command operations first
|
||||||
|
repository.writeMergeCommitMsg(null)
|
||||||
|
repository.writeMergeHeads(null)
|
||||||
|
arrayOf(
|
||||||
|
// reset hard back to our local HEAD
|
||||||
|
git.reset().setMode(ResetCommand.ResetType.HARD),
|
||||||
|
*resetCommands,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
arrayOf(
|
||||||
|
// abort the rebase
|
||||||
|
git.rebase().setOperation(RebaseCommand.Operation.ABORT),
|
||||||
|
*resetCommands,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun preExecute() = if (!git.repository.repositoryState.isRebasing && !merging) {
|
||||||
MaterialAlertDialogBuilder(callingActivity)
|
MaterialAlertDialogBuilder(callingActivity)
|
||||||
.setTitle(callingActivity.resources.getString(R.string.git_abort_and_push_title))
|
.setTitle(callingActivity.resources.getString(R.string.git_abort_and_push_title))
|
||||||
.setMessage(callingActivity.resources.getString(R.string.git_break_out_of_detached_unneeded))
|
.setMessage(callingActivity.resources.getString(R.string.git_break_out_of_detached_unneeded))
|
||||||
|
|
|
@ -7,7 +7,10 @@ package dev.msfjarvis.aps.util.git.operation
|
||||||
import dev.msfjarvis.aps.util.git.sshj.ContinuationContainerActivity
|
import dev.msfjarvis.aps.util.git.sshj.ContinuationContainerActivity
|
||||||
import org.eclipse.jgit.api.GitCommand
|
import org.eclipse.jgit.api.GitCommand
|
||||||
|
|
||||||
class PullOperation(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) {
|
class PullOperation(
|
||||||
|
callingActivity: ContinuationContainerActivity,
|
||||||
|
rebase: Boolean,
|
||||||
|
) : GitOperation(callingActivity) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The story of why the pull operation is committing files goes like this: Once upon a time when
|
* The story of why the pull operation is committing files goes like this: Once upon a time when
|
||||||
|
@ -26,6 +29,6 @@ class PullOperation(callingActivity: ContinuationContainerActivity) : GitOperati
|
||||||
// Commit everything! If needed, obviously.
|
// Commit everything! If needed, obviously.
|
||||||
git.commit().setAll(true).setMessage("[Android Password Store] Sync"),
|
git.commit().setAll(true).setMessage("[Android Password Store] Sync"),
|
||||||
// Pull and rebase on top of the remote branch
|
// Pull and rebase on top of the remote branch
|
||||||
git.pull().setRebase(true).setRemote("origin"),
|
git.pull().setRebase(rebase).setRemote("origin"),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,10 @@ package dev.msfjarvis.aps.util.git.operation
|
||||||
|
|
||||||
import dev.msfjarvis.aps.util.git.sshj.ContinuationContainerActivity
|
import dev.msfjarvis.aps.util.git.sshj.ContinuationContainerActivity
|
||||||
|
|
||||||
class SyncOperation(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) {
|
class SyncOperation(
|
||||||
|
callingActivity: ContinuationContainerActivity,
|
||||||
|
rebase: Boolean,
|
||||||
|
) : GitOperation(callingActivity) {
|
||||||
|
|
||||||
override val commands = arrayOf(
|
override val commands = arrayOf(
|
||||||
// Stage all files
|
// Stage all files
|
||||||
|
@ -16,7 +19,7 @@ class SyncOperation(callingActivity: ContinuationContainerActivity) : GitOperati
|
||||||
// Commit everything! If needed, obviously.
|
// Commit everything! If needed, obviously.
|
||||||
git.commit().setAll(true).setMessage("[Android Password Store] Sync"),
|
git.commit().setAll(true).setMessage("[Android Password Store] Sync"),
|
||||||
// Pull and rebase on top of the remote branch
|
// Pull and rebase on top of the remote branch
|
||||||
git.pull().setRebase(true).setRemote("origin"),
|
git.pull().setRebase(rebase).setRemote("origin"),
|
||||||
// Push it all back
|
// Push it all back
|
||||||
git.push().setPushAll().setRemote("origin"),
|
git.push().setPushAll().setRemote("origin"),
|
||||||
)
|
)
|
||||||
|
|
|
@ -147,6 +147,14 @@ object GitSettings {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var rebaseOnPull
|
||||||
|
get() = settings.getBoolean(PreferenceKeys.REBASE_ON_PULL, true)
|
||||||
|
set(value) {
|
||||||
|
settings.edit {
|
||||||
|
putBoolean(PreferenceKeys.REBASE_ON_PULL, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sealed class UpdateConnectionSettingsResult {
|
sealed class UpdateConnectionSettingsResult {
|
||||||
class MissingUsername(val newProtocol: Protocol) : UpdateConnectionSettingsResult()
|
class MissingUsername(val newProtocol: Protocol) : UpdateConnectionSettingsResult()
|
||||||
class AuthModeMismatch(val newProtocol: Protocol, val validModes: List<AuthMode>) : UpdateConnectionSettingsResult()
|
class AuthModeMismatch(val newProtocol: Protocol, val validModes: List<AuthMode>) : UpdateConnectionSettingsResult()
|
||||||
|
|
|
@ -82,4 +82,6 @@ object PreferenceKeys {
|
||||||
const val PROXY_PORT = "proxy_port"
|
const val PROXY_PORT = "proxy_port"
|
||||||
const val PROXY_USERNAME = "proxy_username"
|
const val PROXY_USERNAME = "proxy_username"
|
||||||
const val PROXY_PASSWORD = "proxy_password"
|
const val PROXY_PASSWORD = "proxy_password"
|
||||||
|
|
||||||
|
const val REBASE_ON_PULL = "rebase_on_pull"
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:padding="@dimen/activity_horizontal_margin"
|
android:padding="@dimen/activity_horizontal_margin"
|
||||||
tools:context="dev.msfjarvis.aps.git.GitConfigActivity"
|
tools:context="dev.msfjarvis.aps.ui.git.config.GitConfigActivity"
|
||||||
tools:layout_editor_absoluteX="0dp"
|
tools:layout_editor_absoluteX="0dp"
|
||||||
tools:layout_editor_absoluteY="81dp">
|
tools:layout_editor_absoluteY="81dp">
|
||||||
|
|
||||||
|
|
|
@ -314,7 +314,7 @@ a app desde unha fonte de confianza, como a Play Store, Amazon Appstore, F-Droid
|
||||||
<string name="new_folder_set_gpg_key">Establece chave GPG para o directorio</string>
|
<string name="new_folder_set_gpg_key">Establece chave GPG para o directorio</string>
|
||||||
<!-- GitException messages -->
|
<!-- GitException messages -->
|
||||||
<string name="git_unknown_error">Fallo descoñecido</string>
|
<string name="git_unknown_error">Fallo descoñecido</string>
|
||||||
<string name="git_pull_fail_error">Fallou a acción pull, estás nun head diferente. Utiliza \"axustes > utilidades git\", garda os cambios no remoto nunha nova rama e resolve o conflicto nun ordenador.</string>
|
<string name="git_pull_rebase_fail_error">Fallou a acción pull, estás nun head diferente. Utiliza \"axustes > utilidades git\", garda os cambios no remoto nunha nova rama e resolve o conflicto nun ordenador.</string>
|
||||||
<string name="git_push_nff_error">O push foi rexeitado polo remoto, executa pull antes de voltar a subilos de novo. Podes usar Sincronizar mellor que push/pull xa que inclú ambos.</string>
|
<string name="git_push_nff_error">O push foi rexeitado polo remoto, executa pull antes de voltar a subilos de novo. Podes usar Sincronizar mellor que push/pull xa que inclú ambos.</string>
|
||||||
<string name="git_push_generic_error">O push foi rexeitado polo remoto, razón:</string>
|
<string name="git_push_generic_error">O push foi rexeitado polo remoto, razón:</string>
|
||||||
<string name="git_push_other_error">O remoto rexeitou o push non-fast-forward. Comproba a variable receive.denyNonFastForwards no ficheiro de configuración do repositorio de destino.</string>
|
<string name="git_push_other_error">O remoto rexeitou o push non-fast-forward. Comproba a variable receive.denyNonFastForwards no ficheiro de configuración do repositorio de destino.</string>
|
||||||
|
|
|
@ -313,7 +313,7 @@
|
||||||
<string name="new_folder_set_gpg_key">Imposta la chiave GPG per la directory</string>
|
<string name="new_folder_set_gpg_key">Imposta la chiave GPG per la directory</string>
|
||||||
<!-- GitException messages -->
|
<!-- GitException messages -->
|
||||||
<string name="git_unknown_error">Errore sconosciuto</string>
|
<string name="git_unknown_error">Errore sconosciuto</string>
|
||||||
<string name="git_pull_fail_error">Pull non è riuscito, sei in un capo distaccato. Usando \"impostazioni e utilità di git\", salvi le tue modifiche in remoto in un nuovo ramo e risolvi il conflitto sul tuo computer.</string>
|
<string name="git_pull_rebase_fail_error">Pull non è riuscito, sei in un capo distaccato. Usando \"impostazioni e utilità di git\", salvi le tue modifiche in remoto in un nuovo ramo e risolvi il conflitto sul tuo computer.</string>
|
||||||
<string name="git_push_nff_error">Push è stato rifiutato da remoto, esegui pull prima di premere nuovamente. Puoi usare Sincronizza piuttosto che pull/push implementando entrambi</string>
|
<string name="git_push_nff_error">Push è stato rifiutato da remoto, esegui pull prima di premere nuovamente. Puoi usare Sincronizza piuttosto che pull/push implementando entrambi</string>
|
||||||
<string name="git_push_generic_error">Push è stato rifiutato da remoto, ragione: %1$s</string>
|
<string name="git_push_generic_error">Push è stato rifiutato da remoto, ragione: %1$s</string>
|
||||||
<string name="git_push_other_error">Remoto ha rifiutato il push non avanti veloce. Controlla la variabile receive.denyNonFastForwards nel file di configurazione della repository di destinazione.</string>
|
<string name="git_push_other_error">Remoto ha rifiutato il push non avanti veloce. Controlla la variabile receive.denyNonFastForwards nel file di configurazione della repository di destinazione.</string>
|
||||||
|
|
|
@ -312,7 +312,7 @@
|
||||||
<string name="new_folder_set_gpg_key">Definir chave GPG para diretório</string>
|
<string name="new_folder_set_gpg_key">Definir chave GPG para diretório</string>
|
||||||
<!-- GitException messages -->
|
<!-- GitException messages -->
|
||||||
<string name="git_unknown_error">Erro desconhecido</string>
|
<string name="git_unknown_error">Erro desconhecido</string>
|
||||||
<string name="git_pull_fail_error">O pull falhou, você está em uma Head avulsa. Usando \"configurações > utils\" do git, salve suas alterações no remoto em uma nova branch e resolva o conflito no seu computador.</string>
|
<string name="git_pull_rebase_fail_error">O pull falhou, você está em uma Head avulsa. Usando \"configurações > utils\" do git, salve suas alterações no remoto em uma nova branch e resolva o conflito no seu computador.</string>
|
||||||
<string name="git_push_nff_error">Push rejeitado pelo remoto, execute o pull antes de fazer push novamente. Você pode usar Sincronização em vez de pull/push conforme implementa ambos</string>
|
<string name="git_push_nff_error">Push rejeitado pelo remoto, execute o pull antes de fazer push novamente. Você pode usar Sincronização em vez de pull/push conforme implementa ambos</string>
|
||||||
<string name="git_push_generic_error">Push rejeitado pelo remoto, razão: %1$s</string>
|
<string name="git_push_generic_error">Push rejeitado pelo remoto, razão: %1$s</string>
|
||||||
<string name="git_push_other_error">O remoto rejeito o push non-fast-foward. Cheque a variável receive.denyNonFastForwards no arquivo de configuração do repositório de destino.</string>
|
<string name="git_push_other_error">O remoto rejeito o push non-fast-foward. Cheque a variável receive.denyNonFastForwards no arquivo de configuração do repositório de destino.</string>
|
||||||
|
|
|
@ -316,7 +316,7 @@
|
||||||
<string name="new_folder_set_gpg_key">Установить GPG ключ для каталога</string>
|
<string name="new_folder_set_gpg_key">Установить GPG ключ для каталога</string>
|
||||||
<!-- GitException messages -->
|
<!-- GitException messages -->
|
||||||
<string name="git_unknown_error">Неизвестная ошибка</string>
|
<string name="git_unknown_error">Неизвестная ошибка</string>
|
||||||
<string name="git_pull_fail_error">Не удалось получить изменения, вы находитесь в состоянии \"оторванной головы\". Используйте \"настройки > утилиты git\", сохраните ваши изменения в новую удаленную ветку и разрешите конфликты на своем компьютере.</string>
|
<string name="git_pull_rebase_fail_error">Не удалось получить изменения, вы находитесь в состоянии \"оторванной головы\". Используйте \"настройки > утилиты git\", сохраните ваши изменения в новую удаленную ветку и разрешите конфликты на своем компьютере.</string>
|
||||||
<string name="git_push_nff_error">Запись изменений была отклонена удаленным репозиторием, сначала пполучите изменения перед повторной записью. Вы можете использовать Синхронизацию вместо получения/записи изменений, т.к. она реализует оба подхда.</string>
|
<string name="git_push_nff_error">Запись изменений была отклонена удаленным репозиторием, сначала пполучите изменения перед повторной записью. Вы можете использовать Синхронизацию вместо получения/записи изменений, т.к. она реализует оба подхда.</string>
|
||||||
<string name="git_push_generic_error">Запись изменений была отклонена удаленным репозиторием, причина: %1$s</string>
|
<string name="git_push_generic_error">Запись изменений была отклонена удаленным репозиторием, причина: %1$s</string>
|
||||||
<string name="git_push_other_error">Удаленный репозиторий отклонил запись изменений без быстрой перемотки вперед. Проверьте переменную receive.denyNonFastForwards в файле конфигурации репозитория назначения.</string>
|
<string name="git_push_other_error">Удаленный репозиторий отклонил запись изменений без быстрой перемотки вперед. Проверьте переменную receive.denyNonFastForwards в файле конфигурации репозитория назначения.</string>
|
||||||
|
|
|
@ -147,6 +147,9 @@
|
||||||
<string name="pref_select_external_repository_summary_no_repo_selected">No external repository selected</string>
|
<string name="pref_select_external_repository_summary_no_repo_selected">No external repository selected</string>
|
||||||
<string name="prefs_export_passwords_title">Export passwords</string>
|
<string name="prefs_export_passwords_title">Export passwords</string>
|
||||||
<string name="prefs_export_passwords_summary">Exports the encrypted passwords to an external directory</string>
|
<string name="prefs_export_passwords_summary">Exports the encrypted passwords to an external directory</string>
|
||||||
|
<string name="pref_rebase_on_pull_title">Rebase on pull</string>
|
||||||
|
<string name="pref_rebase_on_pull_summary">When pulling or syncing, create a merge commit with upstream changes</string>
|
||||||
|
<string name="pref_rebase_on_pull_summary_on">When pulling or syncing, rebase commits that are not present in the remote repository</string>
|
||||||
|
|
||||||
<!-- PasswordGenerator fragment -->
|
<!-- PasswordGenerator fragment -->
|
||||||
<string name="pwgen_title">Generate Password</string>
|
<string name="pwgen_title">Generate Password</string>
|
||||||
|
@ -345,7 +348,9 @@
|
||||||
|
|
||||||
<!-- GitException messages -->
|
<!-- GitException messages -->
|
||||||
<string name="git_unknown_error">Unknown error</string>
|
<string name="git_unknown_error">Unknown error</string>
|
||||||
<string name="git_pull_fail_error">Pull has failed, you\'re in a detached head. Using "settings > git utils", save your changes to the remote in a new branch and resolve the conflict on your computer.</string>
|
<string name="git_pull_rebase_fail_error">Pull has failed, you\'re in a detached head. Using "settings > git utils", save your changes to the remote in a new branch and resolve the conflict on your computer.</string>
|
||||||
|
<string name="git_pull_merge_fail_error">Merge has failed, you\'re in a conflicting state. TODO: Add a recovery method.</string>
|
||||||
|
|
||||||
<string name="git_push_nff_error">Push was rejected by remote, run pull before pushing again. You can use Synchronize rather than pull/push as it implements both</string>
|
<string name="git_push_nff_error">Push was rejected by remote, run pull before pushing again. You can use Synchronize rather than pull/push as it implements both</string>
|
||||||
<string name="git_push_generic_error">Push was rejected by remote, reason: %1$s</string>
|
<string name="git_push_generic_error">Push was rejected by remote, reason: %1$s</string>
|
||||||
<string name="git_push_other_error">Remote rejected non-fast-forward push. Check receive.denyNonFastForwards variable in config file of destination repository.</string>
|
<string name="git_push_other_error">Remote rejected non-fast-forward push. Check receive.denyNonFastForwards variable in config file of destination repository.</string>
|
||||||
|
|
Loading…
Reference in a new issue